为什么Spring 3.x会忽略PropertyPlaceholderConfigurer的某些占位符前缀?

时间:2011-09-29 19:56:24

标签: java spring

我有下面的bean定义。如果我将“exposeSystemProperties”bean的placeholderPrefix更改为“$ {”并在第二个bean的属性路径中使用它,则可以正常工作。如果我将其更改为“%{”它不起作用。我不能使用任何其他字符串(例如“$ sys {”,“#[”等)。我目前正在使用3.0.5.RELEASE。

为什么会这样?为了使它全部复合,我有一个第三个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>

1 个答案:

答案 0 :(得分:2)

由于您需要的前缀是控制特定于环境的属性,因此可以使用系统变量(而不是示例中的deploy.env 属性)来完成此操作:

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

在这种情况下,它总是在下面看:

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

默认情况下,除非设置了ENV_SYSTEM系统变量。例如,如果它设置为“qa”,它将自动显示在:

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

如果您对“展望未来”持开放态度,另一种方法是使用Spring 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();