Spring applicationContext에서 시스템 환경 변수를 읽는 방법
응용 프로그램 컨텍스트에서 시스템 환경 변수를 읽는 방법은 무엇입니까?
나는 다음과 같은 것을 원한다:
<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 ENVIENT VARILE에 따라 설정됩니다.
Spring 3.0을 사용하고 있습니다.
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에서 "system Properties"가 아닌 "system Environment"를 사용하면 됩니다.맘에 들다
#{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;
}
주의: 새로운 환경변수를 설정한 후 이클립스를 다시 시작해야 합니다.
이 기사를 확인해 주세요.를 통해 외부 속성을 지원하는 방법(를 통해)을 통해 이를 수행할 수 있습니다.systemPropertiesMode속성).
네, 할 수 있어요.<property name="defaultLocale" value="#{ systemProperties['user.region']}"/>예를 들어.
변수 systemProperties는 미리 정의되어 있습니다. 6.4.1 XML 기반 구성을 참조하십시오.
bean 정의에 "search System Environment"를 포함하여 "true"로 설정하십시오.파일 경로를 작성하는 데 사용할 경우 파일:// url로 지정합니다.
예를 들어 Configuration파일이 있는 경우
/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>
스프링 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>
다음과 같이 재산 플레이스 홀더를 선언합니다.
<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>
그럼 당신이 읽고 싶다고 합시다.System.property("java.io.tmpdir")Tomcat bean 또는 임의의 bean에 대해 속성 파일에 다음을 추가합니다.
tomcat.tmp.dir=${java.io.tmpdir}
방법은 다음과 같습니다.
<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>
하지만 봄은 먼저 장전되고 그 다음에 이 콩을 장전한다는 것을 기억하라.Factory Bean을 호출하고 있습니다.따라서 테스트 케이스에 이것을 사용하려고 하는 경우는, 반드시 의존을 사용해 주세요.예를 들어 이 경우
메인 클래스에서 사용하는 경우 pom.xml을 사용하여 이 속성을 설정하는 것이 좋습니다.
<systemProperty>
<name>deployment.env</name>
<value>dev</value>
</systemProperty>
속성 파일에서 변수 속성을 언급하고 local.properties, production.properties 등의 환경 고유의 속성 파일을 정의할 수 있습니다.
이제 환경에 따라 이러한 속성 파일 중 하나를 시작할 때 호출된 수신자가 호출한 속성 파일(Servlet Context Listener 등)에서 읽을 수 있습니다.
속성 파일에는 다양한 키에 대한 환경별 값이 포함됩니다.
샘플 "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}" />
이것이 도움이 되기를 바랍니다.
@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'라는 이름의 환경변수가 하나 있어야 합니다.환경변수를 작성한 후 단말기/IDE를 재시작해야 합니다.
업데이트 버전(2020).
시스템을 사용합니다.getenv("ENV_VARILE")
언급URL : https://stackoverflow.com/questions/3965446/how-to-read-system-environment-variable-in-spring-applicationcontext
'programing' 카테고리의 다른 글
| persistence.xml에 요소가 필요합니까? (0) | 2022.12.03 |
|---|---|
| Python 변수가 함수인지 아닌지는 어떻게 검출합니까? (0) | 2022.12.03 |
| JavaScript와 두 날짜 비교 (0) | 2022.12.03 |
| JavaScript 개체의 속성을 나열하려면 어떻게 해야 합니까? (0) | 2022.12.03 |
| WordPress에서 (slug가 아닌) 현재 분류 용어 ID를 얻는 방법은 무엇입니까? (0) | 2022.12.03 |