是否有可能在我的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。
而且,应用程序为占位符绑定了一些默认值,这些默认值不能用通用模块中的默认值定义。