Могу ли я определить свойства системы в файлах конфигурации 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();
   }
}