2016-04-27 15 views
11

Ho un singolo file di configurazione application.yml per la mia app Spring Boot che definisce due profili (come descritto nello documentation).Posso definire le Proprietà di sistema nei file di configurazione di Spring Boot?

Quando il profilo di produzione è abilitato, desidero impostare la proprietà di sistema http.maxConnections su un valore personalizzato, ad es.

spring: 
    profiles: 
     active: dev 
--- 
spring: 
    profiles: dev 
--- 
spring: 
    profiles: production 
http: 
    maxConnections: 15 

Ma in realtà non imposta la proprietà del livello di sistema; sembra solo creare una proprietà a livello di applicazione. Ho verificato questo sia attraverso http://locahost:8080/env e una console JMX quando si confrontano lancio da

java -jar -Dspring.profiles.active=production myapp.jar 

contro

java -Dhttp.maxConnections=15 myapp.jar 

Suppongo che potrei creare un fagiolo che è @Conditional sul profilo "produzione" che chiama programmazione System.setProperty in base alla mia proprietà definita application.yml, ma c'è un modo più semplice attraverso i file di configurazione da solo?

risposta

2

Suppongo che potrei creare un fagiolo che è @Conditional sul profilo "produzione" che a livello di codice callsSystem.setProperty basa sulla mia proprietà application.yml definita, ma c'è un modo più semplice attraverso i file di configurazione da solo ?

Penso che sia la soluzione migliore qui. Spring Boot lo fa da solo nel suo LoggingSystem dove varie proprietà logging.* sono associate alle proprietà di sistema.

Si noti che probabilmente si desidera impostare le proprietà di sistema il prima possibile, probabilmente non appena viene preparato Environment. Per fare ciò, è possibile utilizzare uno ApplicationListener che ascolta lo ApplicationEnvironmentPreparedEvent. L'implementazione ApplicationListener deve essere registrata tramite una voce in spring.factories.

3

Si può provare.

@Profile("production") 
@Component 
public class ProductionPropertySetter { 

    @PostConstruct 
    public void setProperty() { 
     System.setProperty("http.maxConnections", 15); 
    } 

} 
+0

il problema è, è necessario ridistribuire se si vuole cambiare questo, altrimenti si può solo modificare e riavviare la vostra applicazione – Palcente

+0

@Palcente sì, ha senso. Credo che tu possa mettere le proprietà in 'application-production.yml' che saranno usate nel profilo' production'. – TheKojuEffect

0

È possibile inserire l'ambiente nel costruttore della classe che specifica i bean. Ciò consente di scrivere le proprietà dell'applicazione sulle proprietà di sistema prima della creazione dei bean.

@Configuration 
public class ApplicationBeans { 

    @Autowired 
    public ApplicationBeans(Environment environment) { 
     // set system properties before the beans are being created. 
     String property = "com.application.property"; 
     System.getProperties().setProperty(property, environment.getProperty(property)); 
    } 

    /** 
    * Bean that depends on the system properties 
    */ 
    @Bean 
    public SomeBean someBean() { 
     return new SomeBean(); 
    } 
}