2012-04-22 2 views
2

나는 Spring 3.1 응용 프로그램을 가지고 있으며 컨텍스트 파일에서 시스템 변수를 사용하려고합니다. 변수 "JAVA_MY_ENV"는 내 시스템에 정의되어 있습니다 (Windows에서는 제어판의 "시스템 변수"에 있음).

<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>classpath:log/${JAVA_MY_ENV}.log4j.properties</param-value> 
</context-param> 

나는 또한 사용할 수 있습니다 : web.xml에

, 내가 변수로 사용할 수 있습니다 그것은 성공적 변수의 실제 값으로 대체되고, 작동 (의는 "전기 판은"가정 해 봅시다) 내 주 "콩"맥락에서 가져 오기를 수행하는, 또한 작동합니다

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context"  
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <!-- (...) --> 

    <import resource="classpath:spring/app-config.xml" /> 
    <import resource="classpath:spring/env/context-env-${JAVA_MY_ENV}.xml" /> 

</beans> 

그러나 "앱 config.xml에"에서

, 내 다른 컨텍스트 파일 중 하나는,이 시도하고 그것을 아무튼 't 직업 :

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context"  
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <bean id="appConfiguration" class="com.xxx.app.AppConfiguration"> 
     <constructor-arg value="${JAVA_MY_ENV}" /> 
    </bean> 

</beans> 

com.xxx.app.AppConfiguration은 "$ {JAVA_MY_ENV}"문자열을 해석 된 값이 아닌 생성자 매개 변수로 수신합니다!

$ {} 변수가 해석되는 위치와 그렇지 않은 위치를 이해할 수 없습니다.

내 com.xxx.app.AppConfiguration 생성자에 해석 된 $ {JAVA_MY_ENV} 값을 전달할 수있는 방법이 있습니까? 3.0으로

답변

4

봄에 당신 또는 당신이 PropertySourcesPlaceholderConfigurer 또는 유사한 클래스를 사용으로 볼 수있는 속성

@Value("#{ systemProperties['JAVA_MY_ENV'] }") 
private String myVar; 

또는

<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/> 

에 값을 삽입 할 수 있어야합니다. 이것을 생성하면 봄에 변수를 찾는 방법을 알 수 있습니다. 자주 환경 파일과 내부 속성 파일 값을 사용할 수 있도록 여러 속성 파일도 만듭니다. 예 :
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
    <list> 
     <value>classpath:someprops.properties</value> 
    </list> 
    </property> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="searchSystemEnvironment" value="true" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 

상기 예에서 핵심 요소

true로 설정되고 "searchSystemEnvironment"이다. 이것은 봄에 env 변수를 사용하도록 지시한다. (원하는 것이 무엇인지)

+0

문제는 "-DJAVA_MY_ENV = electrotype"으로 내 응용 프로그램을 시작하지 않고 대신 JAVA_MY_ENV를 시스템 전역 변수로 설정한다는 것입니다. 내 응용 프로그램에서 System.getenv ("JAVA_MY_ENV")는 "electrotype"을 반환하지만 System.getProperty ("JAVA_MY_ENV")는 NULL을 반환합니다. @Value ("# {systemProperties [ 'JAVA_MY_ENV']}")도 NULL입니다. web.xml에서 사용하는 * $ {JAVA_MY_ENV} 변수와 동일한 값을 사용하여 값이 동일한 지 확인하는 것이 좋습니다. PropertyPlaceholderConfigurer를 사용하면 "-D"var인지 또는 전역 시스템 속성인지 알 수 없습니다 (어떤 이유로 든 하루 둘 다 사용하는 경우). 감사. – electrotype

0

BruceLowe가 제안한 PropertyPlaceholderConfigurer를 사용하려면 작동한다. 또 다른 방법은 (어쩌면 더 복잡) 나는 특정 속성을 해결하는 것으로는 사용 :

<bean id="JAVA_MY_ENV" class="org.springframework.util.SystemPropertyUtils" factory-method="resolvePlaceholders"> 
    <constructor-arg value="${JAVA_MY_ENV}" /> 
</bean> 

이것은 $ {JAVA_MY_ENV}의 해결 값을 포함하는 문자열 콩을 만듭니다!

그러면 빈 참조를 사용할 수있는 곳이면 어디에서나이 빈을 사용할 수 있습니다. 생성자, 인수 등의 예를 들어

<bean id="appConfiguration" class="com.xxx.app.AppConfiguration"> 
    <constructor-arg ref="JAVA_MY_ENV" /> 
</bean> 

그래서 지금은 PropertyPlaceholderConfigurer와를 추가하지 않고이 해석 장소에서 $ {JAVA_MY_ENV}을 사용하고 JAVA_MY_ENV 콩이 없습니다.

관련 문제