是否有可能在我的applicationContext中有多个PropertyPlaceHolderConfigurer?

我需要根据给定的系统属性加载一个特定的applicationContext.xml文件。 这本身加载一个文件与实际configuration。 因此,我需要2个PropertyPlaceHolderConfigurer,一个parsing系统参数,另一个在实际configuration中。

任何想法如何做到这一点?

是的,你可以做不止一个。 请务必设置ignoreUnresolvablePlaceholders,以便第一个将忽略任何无法parsing的占位符。

<bean id="ppConfig1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <list> <value>classpath*:/my.properties</value> </list> </property> </bean> <bean id="ppConfig2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="false"/> <property name="locations"> <list> <value>classpath*:/myOther.properties</value> </list> </property> </bean> 

根据您的应用程序,您应该调查systemPropertiesMode,它允许您从文件加载属性,但允许系统属性覆盖属性文件中的值(如果设置)。

当心 – 可能有一个与多个configuration器相关的错误。 有关更多详细信息,请参阅http://jira.spring.io/browse/SPR-5719

我无法在本地工作,但我还没有责怪任何人,除了我自己。

另一个解决scheme是使用PropertyPlaceholderConfigurer的placeholderPrefix属性。 您为第二个(第三,第四…)configuration器指定它,然后为所有相应的占位符加前缀,这样就不会有冲突。

 <bean id="mySecondConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="classpath:/myprops.properties" p:placeholderPrefix="myprefix-"/> <bean class="com.mycompany.MyClass" p:myprop="${myprefix-value.from.myprops}"/> 

你不能直接这样做,这个Spring的JIRA问题解释了为什么(查看来自Chris Beams的评论以获得详细的解释):

https://jira.springsource.org/browse/SPR-6428

但是,他确实提供了使用Spring 3.1或更高版本的解决方法,即使用PropertySourcesPlaceholderConfigurer类而不是PropertyPlaceholderConfigurer类。

你可以下载一个基于Maven的项目来演示这个问题,以及来自Spring框架的解决schemegithub:

https://github.com/SpringSource/spring-framework-issues

在下载的项目中查找问题编号SPR-6428。

在我自己的方面,玩PropertyPlaceholderConfigurer这两个属性:

  • 顺序(对于第一次访问/parsing的PPC应该更低)
  • ignoreUnresolvablePlaceholders(对于第一次访问/parsing的PPC为“false”,对于下一个为“true”)

  • 并且还给两个PPC(避免一个被另一个覆盖)提供2个不同的id(s)

完美的作品

希望能帮助到你

我们有以下的方法工作:

 <util:properties id="defaultProperties"> <prop key="stand.name">DEV</prop> <prop key="host">localhost</prop> </util:properties> <context:property-placeholder location="file:${app.properties.path:app.properties}" properties-ref="defaultProperties"/> 

系统属性app.properties.path可以用来覆盖configuration文件的path。

而且,应用程序为占位符绑定了一些默认值,这些默认值不能用通用模块中的默认值定义。