2011-09-29 12 views
1

아래 빈 정의가 있습니다. "exposeSystemProperties"빈에 대한 placeholderPrefix를 "$ {"로 변경하고 두 번째 빈의 특성 경로에서 사용하면 작동합니다. "% {"이외의 것으로 변경하면 작동하지 않습니다. 다른 문자열 (예 : "$ sys {", "# [", 등)을 사용할 수 없습니다. 나는 현재 3.0.5에있다. 릴리스.PropertyPlaceholderConfigurer의 특정 placeholderPrefix를 Spring 3.x가 무시하는 이유는 무엇입니까?

이유에 대한 의견이 있으십니까? 이 모든 것을 합성하기 위해 제 3의 PropertyPlaceHolderConfigure가 있습니다. 따라서 두 개의 접두사 만 있으면 작동하지 않습니다.

<bean id="exposeSystemProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreUnresolvablePlaceholders" value="true" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="placeholderPrefix"><value>$sys{</value></property> 
    <property name="order" value="10" /> 
    </bean> 

    <bean id="localFileProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreUnresolvablePlaceholders" value="true" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_NEVER" /> 
    <property name="placeholderPrefix" value="%{" /> 
    <property name="placeholderSuffix" value="}" /> 
    <property name="order" value="20" /> 
    <property name="locations"> 
     <array> 
     <bean class="java.lang.String"> 
      <constructor-arg><value>classpath:properties/$sys{deploy.env}/client.properties</value></constructor-arg> 
     </bean> 
     </array> 
    </property> 
    </bean> 

답변

2

환경의 특정 속성을 제어하는 ​​것입니다 당신이 접두사를 필요, 이것은 (당신의 예에서 deploy.env특성 대신) 시스템 변수를 사용하여 수행 할 수 있기 때문에 :

<value>classpath:properties/${ENV_SYSTEM:dev}/client.properties</value> 

을에서 항상 아래에 모양이 경우 : 기본적으로

<value>classpath:properties/dev/client.properties</value> 

하는 ENV_SYSTEM 시스템 않는 변수가 설정됩니다. 이 "품질"로 설정되어있는 경우, 예를 들어, 자동으로 아래에 보이는 것 : 당신이 조금 "미래를보고"열려있는 경우,

<value>classpath:properties/qa/client.properties</value> 

또 다른 방법, 스프링 3.1을 사용하는 것입니다 PROFILE feature, 여기서 bean은 특정 프로파일 일 수 있습니다. 예를 들면 :

<beans profile="dev"> 
    <jdbc:embedded-database id="dataSource"> 
     <jdbc:script location="classpath:com/bank/config/sql/schema.sql"/> 
     <jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/> 
    </jdbc:embedded-database> 
</beans> 

dataSource 만 프로필이 dev로 설정된 경우에로드됩니다

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); 
ctx.getEnvironment().setActiveProfiles("dev"); 
ctx.load("classpath:/org/boom/bang/config/xml/*-config.xml"); 
ctx.refresh(); 
+0

그래서 당신이 말하고있는 봄로드를 문맥에 시스템 변수를? 네가 다른 방법으로 폭로해야한다고 생각 했어. –

+0

@Spencer, yes :'System' /'Environment' 변수는 응용 프로그램 컨텍스트 생성시 Spring에서 사용할 수 있으므로 환경을 구동하기 위해 의존 할 수 있습니다. 이 변수는'System.setProperty ("ENV_SYSTEM", "qa")'또는'-D' JVM 인수를 통해 전달할 수 있습니다 : -DENV_SYSTEM = qa' – tolitius

+0

이것은 확실히 작동합니다 내 문제를 해결할 수 있지만 구성자가 제대로 해결하지 못하는 이유를 여전히 해결하지는 못합니다. 필자는이 인라인을 실제로 디버그 할 시간이 없었지만, 그렇게 할 때 내 목록에있는 첫 번째 항목입니다. 다른 견해에 감사드립니다. –

관련 문제