我有三个属性文件:
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"/>
还有一个加载上下文并注入(inject)所有属性的测试。 MyTest.java:
@Value("${propA}")
private String propA;
@Value("${propB}")
private String propB;
@Value("${propC}")
private String propC;
我得到以下值:
propA=2
propB=2
propC=3
为什么“propA”和“propB”不是从 file3.properties 中获取的?
最佳答案
拥有多个属性占位符配置器并不像您想象的那样工作。没有属性覆盖功能。第一个尝试并替换它可以替换的内容,然后下一个尝试用剩下的内容等等。 如果你想覆盖属性,你最好定义一个具有多个源的属性 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" />
关于java - 具有重叠位置的多个属性占位符不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122019/