我有一个带有applicationContext.xml文件的Spring Web应用程序,该文件位于WEB-INF目录中。在该文件中,我有以下定义:
<context:property-placeholder location="file:/etc/mycompany/myapp.properties"
order="-1" ignore-unresolvable="true" ignore-resource-not-found="true" />
<context:property-placeholder location="classpath:myapp-defaults.properties"
order="0" ignore-unresolvable="true" ignore-resource-not-found="true" />
<context:component-scan base-package="com.mycompany" />
<context:annotation-config/>
然后我有一个类,com.mycompany.MyClass:
@Named
@Singleton
@Service("myClassService")
public class MyClass {
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
@Value("${myprop}")
private String myProp;
}
我有两个属性文件,myapp.properties(位于类路径中)和/etc/mycompany/myapp.properties。这两个都使用不同的值定义myprop属性。
如果我注释掉applicationContext.xml文件中的两个元素并打印出myProp变量的值,我会得到值“$ {myprop}”(这是预期的)。
然而,现在对于奇怪的部分。如果我只是注释掉其中一行,我总是从类路径属性文件中获取值。请注意,我注释掉哪个属性占位符行无关紧要。即使我注释掉包含类路径属性定义的那个,我仍然将classpath属性值放入变量中。
如果我使用仅在文件系统属性文件中定义的属性,则会得到正确的值。
换句话说,似乎没有办法通过在我的文件系统的属性文件中定义它们来覆盖myapp-defaults.properties(在类路径中)中的值。从文件系统上的文件获取属性的唯一方法是在类路径属性文件中未定义该属性。
我试过逆转订单属性无济于事(据我所知,这是正确的方法,较低的数字应该优先)。
我也尝试调试我的应用程序并在Spring源代码中的选定位置放置一个断点。我能够看到属性是从文件系统属性文件加载的。当我注释掉classpath属性占位符时,我注意到文件系统属性文件正在正确加载,但是当打印出变量值时,它仍然具有在类路径属性文件中定义的值。
我真的很困惑。我有没有陷入陷阱?