Могу ли я определить свойства системы в файлах конфигурации Spring Boot?
У меня есть один конфигурационный файл application.yml
для моего приложения 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, который @Conditional
в профиле "production", который программным образом вызывает System.setProperty
на основе моего свойства application.yml
-defined, но есть ли более простой способ только через файлы конфигурации?
Ответы
Ответ 1
Я полагаю, что я мог бы создать bean, который @Conditional в профиле "production", который программным способом вызываетSystem.setProperty на основе моего свойства, указанного в application.yml, но есть ли более простой способ только через файлы конфигурации?
Я думаю, что ваш лучший выбор здесь. Spring Boot делает это сам в своем LoggingSystem
, где различные свойства logging.*
отображаются в свойствах системы.
Обратите внимание, что вы, вероятно, захотите установить свойства системы как можно раньше, возможно, как только будет подготовлен Environment
. Для этого вы можете использовать ApplicationListener
, который прослушивает ApplicationEnvironmentPreparedEvent
. Ваша реализация ApplicationListener
должна быть зарегистрирована через запись в spring.factories
.
Ответ 2
Вы можете попробовать.
@Profile("production")
@Component
public class ProductionPropertySetter {
@PostConstruct
public void setProperty() {
System.setProperty("http.maxConnections", 15);
}
}
Ответ 3
Вы можете ввести среду в конструктор класса, который указывает beans. Это позволяет вам писать свойства приложения в свойствах системы до создания 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();
}
}