2016-04-27 18 views
11

Tôi có một tệp cấu hình application.yml duy nhất cho ứng dụng Khởi động mùa xuân của tôi xác định hai cấu hình (như được mô tả trong documentation).Tôi có thể xác định Thuộc tính Hệ thống trong các tệp cấu hình Spring Boot không?

Khi hồ sơ sản xuất được bật, tôi muốn đặt thuộc tính hệ thống http.maxConnections thành giá trị tùy chỉnh, ví dụ:

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

Nhưng điều này không thực sự đặt thuộc tính mức hệ thống; có vẻ như chỉ tạo thuộc tính cấp ứng dụng. Tôi đã xác minh điều này thông qua cả hai http://locahost:8080/env và một điều khiển JMX khi so sánh bằng cách ra

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

so

java -Dhttp.maxConnections=15 myapp.jar 

Tôi cho rằng tôi có thể tạo ra một bean đó là @Conditional vào "sản xuất" hồ sơ mà lập trình gọi System.setProperty dựa trên thuộc tính được định nghĩa application.yml của tôi, nhưng có cách nào đơn giản hơn thông qua các tệp cấu hình không?

Trả lời

2

Tôi cho rằng tôi có thể tạo ra một bean đó là @Conditional vào "sản xuất" hồ sơ mà lập trình callsSystem.setProperty dựa trên tài sản application.yml định nghĩa của tôi, nhưng là có một cách đơn giản thông qua file cấu hình riêng ?

Tôi nghĩ đó là đặt cược tốt nhất của bạn ở đây. Spring Boot tự làm điều đó trong các thuộc tính LoggingSystem trong đó các thuộc tính khác nhau của logging.* được ánh xạ tới thuộc tính Hệ thống.

Lưu ý rằng bạn có thể muốn đặt thuộc tính hệ thống càng sớm càng tốt, có thể ngay khi chuẩn bị Environment. Để làm như vậy, bạn có thể sử dụng số ApplicationListener để nghe số ApplicationEnvironmentPreparedEvent. Việc triển khai ApplicationListener của bạn phải được đăng ký thông qua mục nhập trong spring.factories.

3

Bạn có thể thử.

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

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

} 
+0

vấn đề là bạn cần triển khai lại nếu bạn muốn thay đổi điều này, nếu không bạn chỉ có thể sửa đổi và khởi động lại ứng dụng – Palcente

+0

@Palcente yes, điều đó có lý. Tôi tin rằng bạn có thể đặt các thuộc tính trong 'application-production.yml' sẽ được sử dụng trong hồ sơ' production'. – TheKojuEffect

0

Bạn có thể đưa môi trường vào hàm tạo của lớp chỉ định các bean. Điều này cho phép bạn ghi các thuộc tính ứng dụng vào các thuộc tính hệ thống trước khi các bean được tạo ra.

@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(); 
    } 
} 
Các vấn đề liên quan