web-dev-qa-db-ja.com

Spring Boot構成ファイル内でシステムプロパティを定義できますか?

2つのプロファイルを定義するSpring Bootアプリ用の単一のapplication.yml構成ファイルがあります( documentation で説明されています)。

実稼働プロファイルが有効になっている場合、 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

versus

Java -Dhttp.maxConnections=15 myapp.jar

私は@Conditional定義されたプロパティに基づいてプログラムでSystem.setPropertyを呼び出す "生産"プロファイルでapplication.ymlのBeanを作成できたと思いますが、構成ファイルのみを使用した簡単な方法はありますか?

22
bdkosher

Application.ymlで定義されたプロパティに基づいてプログラムでSystem.setPropertyを呼び出す「プロダクション」プロファイルで@ConditionalのBeanを作成できたと思いますが、設定ファイルのみを使用した簡単な方法はありますか?

ここが最善の策だと思います。 Spring Bootは、さまざまなlogging.*プロパティがシステムプロパティにマップされるLoggingSystemでそれ自体を実行します。

おそらく、できるだけ早く、おそらくEnvironmentが準備されたらすぐに、システムプロパティを設定することに注意してください。そのためには、ApplicationListenerをリッスンするApplicationEnvironmentPreparedEventを使用できます。 ApplicationListener実装は、spring.factoriesのエントリを介して登録する必要があります。

4
Andy Wilkinson

試してみてください。

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

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

}
8
TheKojuEffect

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

Org.springframework.beans.factory.configのPropertyPlaceholderConfigurerを使用して、プロパティファイルを処理することもできます。

0
RamBharath