2016-04-27 98 views
11

我的Spring Boot应用程序有一个application.yml配置文件,它定义了两个配置文件(如documentation中所述)。我可以在Spring Boot配置文件中定义系统属性吗?

当生产配置文件启用时,我想将http.maxConnections系统属性设置为自定义值,例如,

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

但是,这实际上并没有设置系统级别的属性;它似乎只是创建一个应用程序级属性。我通过两个http://locahost:8080/env验证了这一点和JMX控制台通过

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

比较下水时与

java -Dhttp.maxConnections=15 myapp.jar 

我想我可以创建一个bean,关于“生产”配置文件,编程调用System.setProperty@Conditional基于我的application.yml-定义的属性,但通过配置文件是否有一个更简单的方法?

回答

2

我想我可以创建一个bean这是对编程callsSystem.setProperty根据我application.yml定义的属性“生产”曲线@Conditional,但有通过单独的配置文件,一个简单的方法?

我认为这是你最好的选择。 Spring Boot自己在其LoggingSystem中将各种logging.*属性映射到系统属性。

请注意,您可能需要尽早设置系统属性,可能只要准备好Environment即可。为此,您可以使用ApplicationListener来侦听ApplicationEnvironmentPreparedEvent。您的ApplicationListener实施应通过登录spring.factories注册。

3

您可以试试。

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

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

} 
+0

的问题是,你需要重新部署,如果你想改变它,否则,你可以只修改并重新启动应用程序 – Palcente

+0

@Palcente是的,这是有意义的。我相信你可以把属性放在'application-production.yml'中,它将被用在'production'配置文件中。 – TheKojuEffect

0

您可以将环境注入指定bean的类的构造函数中。这使您可以在创建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(); 
    } 
} 
相关问题