我有三个属性文件:
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中获取?
答案 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中不可用。