4

我无法让 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 中的属性来解析它们的占位符? 我已经做了大量的研究,包括跟踪 spring 代码 - 我可以看到如何以及为什么没有这样做。我希望有一些我只是想念的设置!这是我的第一篇文章,所以请放轻松:)

4

2 回答 2

1

您已经正确配置了 spring 和属性文件。这就是为什么您能够从文件中读取数据的原因。spring 所做的一切都是正确的,让我再解释一下....

正如您在下面所说的是您的财产文件,

property1=prop1val
property2=${property1}

请记住,它是一个带有键值对的漂亮文本文件,它不能接受变量。在这里,如果您打算动态复制 to 的值,property1property2不会发生。这不是我们应该使用属性文件的方式。

属性文件应该是带有键值对的简单文本文件。因此,请保持键的原子性,以便您可以从应用程序或applicationcontext.xml文件中以逻辑方式构造所需的数据。

于 2012-05-02T13:26:18.560 回答
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>  
于 2012-05-02T15:08:30.973 回答