我无法让PropertyPlaceholderConfigurer在我当前的配置中工作。给出applicationContext.xml中的以下代码块:
<bean id="myProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<!-- Order matters, last one to create a property wins! -->
<value>classpath:default.properties</value>
<value>file:${MYAPP_PROPERTIES_LOCATION:badurl}/application.properties</value>
<value>file:${user.home}/developer.properties</value>
</list>
</property>
<property name="ignoreResourceNotFound" value="true"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertiesPlaceholderConfigurer">
<property name="properties" ref="myProperties"/>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="searchSystemEnvironment" value="true"/>
</bean>
然后在default.properties文件中,我有以下内容(这些是测试属性):
property1=prop1val
property2=${property1}
什么有效:propertyConfigurer正确解析环境变量MYAPP_PROPERTIES_LOCATION和系统变量user.home。但是,最终的属性对象是由工厂bean创建的,结果属性是 [property1 = prop1val,property2 = $ {property1}] 。
通过这种配置,我如何获取myProperties bean中的属性来解析它们的占位符?我做了大量的研究,包括跟踪弹簧代码 - 我可以看到如何和为什么没有这样做。我希望有一些我不知道的设置!这是我的第一篇文章,所以对我来说很容易:)
答案 0 :(得分:1)
您正确配置了spring和属性文件。这就是为什么你能够从文件中读取数据的原因。 春天的一切都是正确的,让我再解释一下......
如下所述,是您的财产档案,
property1=prop1val
property2=${property1}
请记住,它是一个带有键值对的漂亮文本文件,它不能接受变量。在这里,如果您打算将property1
的值动态复制到property2
,则不会发生这种情况。这不是我们应该使用属性文件的方式。
属性文件应该是具有键值对的简单文本文件。因此,保持密钥是原子的,以便您可以从应用程序或applicationcontext.xml
文件中逻辑地构造所需的数据。
答案 1 :(得分:0)
我不确定您使用PropertiesFactoryBean
的原因。您能否请尝试下面的内容(不确定您是否已经尝试过以及遇到的任何问题)
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- Order matters, last one to create a property wins! -->
<value>classpath:default.properties</value>
<value>file:${MYAPP_PROPERTIES_LOCATION:badurl}/application.properties</value>
<value>file:${user.home}/developer.properties</value>
</list>
</property>
</bean>