アプリケーションコンテキストでシステム環境変数を読み取る方法
私のようなものが欲しい:
<util:properties id="dbProperties"
location="classpath:config_DEV/db.properties" />
または
<util:properties id="dbProperties"
location="classpath:config_QA/db.properties" />
環境に応じて。
アプリケーションコンテキストにこのようなものを含めることはできますか?
<util:properties id="dbProperties"
location="classpath:config_${systemProperties.env}/db.properties" />
実際のvalは、SYSTEM ENVIRONMENT VARIABLEに基づいて設定されます
Spring 3.0を使用しています
この記事 を確認してください。外部プロパティをサポートする PropertyPlaceholderConfigurer
を介して(systemPropertiesMode
プロパティを介して)、これを行ういくつかの方法を提供します。
近いです:o)Spring 3.0に Spring Expression Language が追加されました。使用できます
<util:properties id="dbProperties"
location="classpath:config_#{systemProperties['env']}/db.properties" />
Java ... -Denv=QA
と組み合わせると、問題が解決するはずです。
@yilingによるコメントにも注意してください。
システム環境変数、つまりamoeがコメントしたOSレベル変数にアクセスするには、そのELで「systemProperties」の代わりに「systemEnvironment」を使用します。
#{systemEnvironment['ENV_VARIABLE_NAME']}
のような
あなたが置くことができる今日
@Autowired
private Environment environment;
@Component
、@Bean
などで、Environment
クラスを介してプロパティにアクセスします。
environment.getProperty("myProp");
単一のプロパティの場合 in @Bean
@Value("${my.another.property:123}") // value after ':' is the default
Integer property;
別の方法は便利な@ConfigurationProperties
Beanです:
@ConfigurationProperties(prefix="my.properties.prefix")
public class MyProperties {
// value from my.properties.prefix.myProperty will be bound to this variable
String myProperty;
// and this will even throw a startup exception if the property is not found
@javax.validation.constraints.NotNull
String myRequiredProperty;
//getters
}
@Component
public class MyOtherBean {
@Autowired
MyProperties myProperties;
}
注:新しい環境変数を設定した後、Eclipseを再起動することを忘れないでください
はい、たとえば<property name="defaultLocale" value="#{ systemProperties['user.region']}"/>
を実行できます。
変数systemPropertiesは事前定義されています。 6.4.1 XMLベースの構成 を参照してください。
Bean定義では、必ず「searchSystemEnvironment」を含めて「true」に設定してください。また、ファイルへのパスを作成するために使用している場合は、file:/// urlとして指定します。
たとえば、設定ファイルが
/testapp/config/my.app.config.properties
次に、環境変数を次のように設定します。
MY_ENV_VAR_PATH=/testapp/config
アプリは次のようなBean定義を使用してファイルをロードできます。
例えば.
<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true" />
<property name="searchContextAttributes" value="true" />
<property name="contextOverride" value="true" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>file:///${MY_ENV_VAR_PATH}/my.app.config.properties</value>
</list>
</property>
</bean>
Spring ELを使用すると、次のように書くことができます eis example write
<bean id="myBean" class="path.to.my.BeanClass">
<!-- can be overridden with -Dtest.target.Host=http://whatever.com -->
<constructor-arg value="#{systemProperties['test.target.Host'] ?: 'http://localhost:18888'}"/>
</bean>
ユースケースでは、システムプロパティのみにアクセスする必要がありましたが、未定義の場合はデフォルト値を提供しました。
これがあなたのやり方です:
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true" />
</bean>
<bean id="myBean" class="path.to.my.BeanClass">
<!-- can be overridden with -Dtest.target.Host=http://whatever.com -->
<constructor-arg value="${test.target.Host:http://localhost:18888}"/>
</bean>
次のようにプロパティプレースホルダーを宣言します
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="locations">
<list>
<value>file:///path.to.your.app.config.properties</value>
</list>
</property>
</bean>
次に、Tomcat Beanまたは任意のBeanのSystem.property("Java.io.tmpdir")
を読み取り、プロパティファイルに以下を追加するとします。
Tomcat.tmp.dir=${Java.io.tmpdir}
プロパティファイルで変数属性を指定し、local.properties、production.propertiedなどの環境固有のプロパティファイルを定義できます。
現在、環境に基づいて、これらのプロパティファイルの1つは、ServletContextListenerなど、起動時に呼び出されるリスナーで読み取ることができます。
プロパティファイルには、さまざまなキーの環境固有の値が含まれます。
サンプル「local.propeties」
db.logsDataSource.url=jdbc:mysql://localhost:3306/logs
db.logsDataSource.username=root
db.logsDataSource.password=root
db.dataSource.url=jdbc:mysql://localhost:3306/main
db.dataSource.username=root
db.dataSource.password=root
サンプル「production.properties」
db.logsDataSource.url=jdbc:mariadb://111.111.111.111:3306/logs
db.logsDataSource.username=admin
db.logsDataSource.password=xyzqer
db.dataSource.url=jdbc:mysql://111.111.111.111:3306/carsinfo
db.dataSource.username=admin
db.dataSource.password=safasf@mn
これらのプロパティファイルを使用するには、以下で説明するようにREsourceを使用できます。
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("classpath:"+System.getenv("SERVER_TYPE")+"DB.properties");
configurer.setLocation(resource);
configurer.postProcessBeanFactory(beanFactory);
SERVER_TYPEは、ローカルおよび実稼働環境に適切な値を持つ環境変数として定義できます。
これらの変更により、appplicationContext.xmlには次の変更が加えられます。
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="${db.dataSource.url}" />
<property name="username" value="${db.dataSource.username}" />
<property name="password" value="${db.dataSource.password}" />
お役に立てれば 。
これがあなたのやり方です:
<bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" scope="prototype">
<property name="targetObject" value="#{@systemProperties}" />
<property name="targetMethod" value="putAll" />
<property name="arguments">
<util:properties>
<prop key="deployment.env">dev</prop>
</util:properties>
</property>
</bean>
ただし、スプリングが最初にロードされ、次にこのBean MethodInvokingFactoryBeanがロードされることに注意してください。したがって、テストケースにこれを使用しようとしている場合は、depends-onを使用してください。たとえばこの場合
メインクラスで使用する場合は、pom.xmlを使用してこのプロパティを設定することをお勧めします
<systemProperty>
<name>deployment.env</name>
<value>dev</value>
</systemProperty>
@Yilingに感謝します。それはヒントでした。
<bean id="propertyConfigurer"
class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true" />
<property name="locations">
<list>
<value>file:#{systemEnvironment['FILE_PATH']}/first.properties</value>
<value>file:#{systemEnvironment['FILE_PATH']}/second.properties</value>
<value>file:#{systemEnvironment['FILE_PATH']}/third.properties</value>
</list>
</property>
</bean>
この後、「FILE_PATH」という名前の環境変数が1つ必要です。その環境変数を作成した後、ターミナル/ IDEを再起動してください。