working tutorial not example español application java spring-boot system-properties

java - tutorial - ¿Puedo definir las propiedades del sistema dentro de los archivos de configuración de Spring Boot?



java spring boot tutorial español (4)

Tengo un único archivo de configuración application.yml para mi aplicación Spring Boot que define dos perfiles (como se describe en la documentation ).

Cuando el perfil de producción está habilitado, me gustaría establecer la propiedad del sistema http.maxConnections en un valor personalizado, por ejemplo

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

Pero esto no establece realmente la propiedad de nivel de sistema; parece que acaba de crear una propiedad de nivel de aplicación. He verificado esto a través de http://locahost:8080/env y una Consola JMX al comparar el lanzamiento de

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

versus

java -Dhttp.maxConnections=15 myapp.jar

Supongo que podría crear un bean que sea @Conditional en el perfil de "producción" que llame a System.setProperty mediante programación en función de mi propiedad application.yml -defined, pero ¿hay una forma más sencilla solo a través de los archivos de configuración?


Supongo que podría crear un bean que sea @Condicional en el perfil de "producción" que programáticamente se llame a System.setProperty en función de mi propiedad definida por application.yml, pero ¿hay una forma más sencilla solo a través de los archivos de configuración?

Creo que esa es tu mejor apuesta aquí. Spring Boot hace eso por sí mismo en su LoggingSystem donde varias propiedades logging.* Se asignan a las propiedades del sistema.

Tenga en cuenta que probablemente querrá establecer las propiedades del sistema lo antes posible, probablemente tan pronto como el Environment esté preparado. Para hacerlo, puedes usar un ApplicationListener que escucha el ApplicationEnvironmentPreparedEvent . Su implementación de ApplicationListener debe registrarse a través de una entrada en spring.factories .


Puede inyectar el entorno en el constructor de la clase que especifica los beans. Esto le permite escribir las propiedades de la aplicación en las propiedades del sistema antes de que se creen los 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(); } }


Puedes intentarlo.

@Profile("production") @Component public class ProductionPropertySetter { @PostConstruct public void setProperty() { System.setProperty("http.maxConnections", 15); } }


También puede usar PropertyPlaceholderConfigurer desde org.springframework.beans.factory.config para controlar su archivo de propiedades