具有重叠位置的多个属性占位符不起作用?

时间:2014-11-25 08:40:09

标签: java spring

我有三个属性文件:

file1.properties包含:
propA=1

file2.properties包含:
propA=2 propB=2

file3.properties包含:
propA=3 propB=3 propC=3

两个应用程序上下文:

applicationContext1.xml包含:
<context:property-placeholder location="classpath:file1.properties,classpath:file2.properties" ignore-resource-not-found="true" ignore-unresolvable="true" system-properties-mode="OVERRIDE"/>

applicationContext2.xml包含:
<context:property-placeholder location="classpath:file2.properties,classpath:file3.properties" ignore-resource-not-found="true" ignore-unresolvable="true" system-properties-mode="OVERRIDE"/>

加载两个上下文并注入所有属性的测试。 MyTest.java:

@Value("${propA}")
private String propA;

@Value("${propB}")
private String propB;

@Value("${propC}")
private String propC;

我得到以下数值:

 propA=2
 propB=2
 propC=3

为什么&#39; propA&#39;和&#39; propB&#39;没有从file3.properties中获取?

2 个答案:

答案 0 :(得分:1)

拥有多个property-placeholder-configurers并不像您想象的那样有效。没有属性覆盖功能。第一个尝试并替换它可以的东西,然后下一个尝试剩下的东西,依此类推。 如果要覆盖属性,最好使用多个源定义属性bean,例如:

<bean name="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
        <property name="locations">
            <list>
                <value>classpath:conf/app-defaults.properties</value>
                <value>file:${CATALINA_BASE}/conf/my-app.properties</value>                 
            </list>
        </property>
        <property name="ignoreResourceNotFound" value="true" />
    </bean>

上面的代码定义了一个带有默认值的属性bean,它来自一个类路径文件和一个可选的外化文件,它覆盖默认值并驻留在tomcat安装中。 然后,您可以使用属性占位符,如:

<context:property-placeholder properties-ref="appProperties" /> 

答案 1 :(得分:0)

Applicationcontext2已覆盖applicationcontext1

确认在file1.prop中添加一个新变量,该变量在另外两个file2和file3中不可用。