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