2016-04-27 56 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(); 
    } 
} 
相關問題