2016-04-27 19 views
11

İki profili tanımlayan (documentation'da açıklandığı gibi) Spring Boot uygulamam için tek bir application.yml yapılandırma dosyası var.Spring Boot yapılandırma dosyalarında Sistem Özellikleri tanımlayabilir miyim?

Üretim profili etkinleştirildiğinde, http.maxConnections sistem özelliğini özel bir değere, örn.

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

Ancak bu aslında sistem düzeyi özelliğini ayarlamaz; Sadece uygulama düzeyinde bir özellik oluşturuyor gibi görünüyor. Hem http://locahost:8080/env ile bu doğrulandıktan ve JMX Konsol Ben programlı System.setProperty çağıran "Üretim" profilde @Conditional olan bir fasulye oluşturmak herhalde

java -Dhttp.maxConnections=15 myapp.jar 

karşı

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

tarafından başlatılması karşılaştırırken benim application.yml -defined özelliğine dayanarak, ancak yapılandırma dosyaları tek başına daha basit bir yolu var mı?

cevap

2

Ben programlı callsSystem.setProperty benim application.yml tanımlı mülkiyet dayalı "üretim" profilde @Conditional olan bir fasulye oluşturabilir varsayalım, ama tek başına yapılandırma dosyaları aracılığıyla daha basit bir yolu var ?

Bence bu en iyi bahistir. Spring Boot, çeşitli logging.* özelliklerinin Sistem özelliklerine eşlendiği, kendi LoggingSystem içinde bunu yapar.

Muhtemelen sistem özelliklerini mümkün olduğunca erken ayarlamak isteyeceksiniz, muhtemelen Environment hazırlanır yapılmaz. Bunu yapmak için ApplicationEnvironmentPreparedEvent dinleyen bir ApplicationListener kullanabilirsiniz. ApplicationListener uygulamanızın spring.factories numaralı bir girişten kaydedilmesi gerekir.

3

Siz de deneyebilirsiniz.

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

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

} 
+0

, aksi takdirde sadece onu değiştirmek ve mantıklı uygulamanızı – Palcente

+0

@Palcente evet yeniden olabilir, bunu değiştirmek isterseniz tekrar uygulamanız gerekmez. "Üretim" profilinde kullanılacak olan "application-production.yml" işlevine sahip olabileceğinize inanıyorum. – TheKojuEffect

0

Çevreyi, çekirdekleri belirten sınıfın yapıcısına enjekte edebilirsiniz. Bu, çekirdekler oluşturulmadan önce sistem özelliklerine uygulama özellikleri yazmanıza izin verir. sorundur

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