2014-11-25 29 views
1

我有三个属性文件:具有重叠位置的多个属性占位符不起作用?

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 

为什么 'propA' 和 'PROPB' 不是从file3.properties取?

+0

为什么要这样。一旦它被替换,它被替换。如果第一个占位符已经完成了工作,那么就没有什么可以替代的了。 – 2014-11-25 09:28:15

回答

1

拥有多个属性占位符配置器不像您所设想的那样工作。没有属性覆盖功能。第一个尝试并替换它可以的,然后下一个等等。 如果你想覆盖的属性,你可以更好地定义一个属性的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> 

上面的代码定义了一个性能豆为默认设置,从类路径文件和一个可选的外部化的文件,覆盖默认值来并驻留在tomcat安装中。 然后你可以使用一个属性占位符,如:

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

谢谢,看来你和M.Deinum是对的。但是,我怎么能覆盖/扩展在生产applicationContext中定义的属性占位符的行为只是为了我的测试? – 2014-11-25 15:54:10

+0

它不是占位符 - 配置器本身的行为。我想你更愿意在一个新的问题中更详细地表达实际想要做什么,并在配置中提供更多细节 – grid 2014-11-26 17:26:12

0

Applicationcontext2已覆盖applicationcontext1

确认在file1.prop中添加一个新变量,该变量不应该在另外两个文件2和文件3中可用。

+0

我将新属性添加到file1并将其注入到类中,因此applicationContext2不会覆盖applicationcontext1。 – 2014-11-25 15:48:29