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を作成できたと思いますが、構成ファイルのみを使用した簡単な方法はありますか?
Application.ymlで定義されたプロパティに基づいてプログラムでSystem.setPropertyを呼び出す「プロダクション」プロファイルで@ConditionalのBeanを作成できたと思いますが、設定ファイルのみを使用した簡単な方法はありますか?
ここが最善の策だと思います。 Spring Bootは、さまざまなlogging.*
プロパティがシステムプロパティにマップされるLoggingSystem
でそれ自体を実行します。
おそらく、できるだけ早く、おそらくEnvironment
が準備されたらすぐに、システムプロパティを設定することに注意してください。そのためには、ApplicationListener
をリッスンするApplicationEnvironmentPreparedEvent
を使用できます。 ApplicationListener
実装は、spring.factories
のエントリを介して登録する必要があります。
試してみてください。
@Profile("production")
@Component
public class ProductionPropertySetter {
@PostConstruct
public void setProperty() {
System.setProperty("http.maxConnections", 15);
}
}
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();
}
}
Org.springframework.beans.factory.configのPropertyPlaceholderConfigurerを使用して、プロパティファイルを処理することもできます。