web-dev-qa-db-fra.com

Puis-je définir les propriétés système dans les fichiers de configuration de Spring Boot?

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?

20
bdkosher

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.

4
Andy Wilkinson

Vous pouvez essayer.

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

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

}
8
TheKojuEffect

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();
   }
}
0
jjoller

Vous pouvez également utiliser PropertyPlaceholderConfigurer à partir de org.springframework.beans.factory.config pour gérer votre fichier de propriétés.

0
RamBharath