J'ai un seul fichier de configuration application.yml
pour mon application Spring Boot qui définit deux profils (comme décrit dans documentation ).
Lorsque le profil de production est activé, je souhaite définir la propriété système http.maxConnections
sur une valeur personnalisée, par exemple.
spring:
profiles:
active: dev
---
spring:
profiles: dev
---
spring:
profiles: production
http:
maxConnections: 15
Mais cela ne définit pas réellement la propriété de niveau système; il semble créer simplement une propriété au niveau de l'application. J'ai vérifié cela par le biais de http: // locahost: 8080/env et d'une console JMX lors de la comparaison du lancement par
Java -jar -Dspring.profiles.active=production myapp.jar
contre
Java -Dhttp.maxConnections=15 myapp.jar
Je suppose que je pourrais créer un bean @Conditional
sur le profil "production" qui appelle par programmationSystem.setProperty
en fonction de ma propriété application.yml
-définie, mais existe-t-il un moyen plus simple d'utiliser des fichiers de configuration?
Je suppose que je pourrais créer un bean @Conditional sur le profil "production" qui appelle par programmeSystem.setProperty en fonction de ma propriété définie par application.yml, mais existe-t-il un moyen plus simple d'utiliser des fichiers de configuration?
Je pense que c'est votre meilleur pari ici. Spring Boot fait cela lui-même dans sa LoggingSystem
où différentes propriétés logging.*
sont mappées aux propriétés système.
Notez que vous souhaiterez probablement définir les propriétés du système le plus tôt possible, probablement dès que la variable Environment
sera préparée. Pour ce faire, vous pouvez utiliser une ApplicationListener
qui écoute la ApplicationEnvironmentPreparedEvent
. Votre implémentation ApplicationListener
doit être enregistrée via une entrée dans spring.factories
.
Vous pouvez essayer.
@Profile("production")
@Component
public class ProductionPropertySetter {
@PostConstruct
public void setProperty() {
System.setProperty("http.maxConnections", 15);
}
}
Vous pouvez injecter l'environnement dans le constructeur de la classe spécifiant les beans. Cela vous permet d'écrire des propriétés d'application dans les propriétés système avant la création des beans.
@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();
}
}
Vous pouvez également utiliser PropertyPlaceholderConfigurer à partir de org.springframework.beans.factory.config pour gérer votre fichier de propriétés.