애플리케이션 컨텍스트에서 시스템 환경 변수를 읽는 방법은 무엇입니까?
나는 다음과 같은 것을 원한다.
<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" />
실제 값은 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");
단일 속성 의 경우@Bean
@Value("${my.another.property:123}") // value after ':' is the default
Integer property;
또 다른 방법 은 편리한 @ConfigurationProperties
콩입니다.
@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 기반 구성을 참조하십시오 .
답변
빈 정의에 “searchSystemEnvironment”를 포함하고 “true”로 설정해야합니다. 파일 경로를 만드는 데 사용하는 경우 file : /// url로 지정합니다.
예를 들어 설정 파일이있는 경우
/testapp/config/my.app.config.properties
그런 다음 다음과 같이 환경 변수를 설정하십시오.
MY_ENV_VAR_PATH=/testapp/config
앱은 다음과 같은 빈 정의를 사용하여 파일을로드 할 수 있습니다.
예 :
<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을 사용하면 다음과 같이 예제를 작성할 수 있습니다.
<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>