我在 WEB-INF 目录中有一个带有 applicationContext.xml 文件的 Spring Web 应用程序。在该文件中,我有以下定义:
<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}”(这是预期的)。
然而,现在是奇怪的部分。如果我只是注释掉其中一行,我总是从类路径属性文件中获取值。请注意,我注释掉哪个属性占位符行并不重要。即使我注释掉包括类路径属性定义的那个,我仍然将类路径属性值放入变量中。
如果我使用仅在文件系统属性文件中定义的属性,我会得到正确的值。
所以换句话说,我似乎无法通过在我的文件系统的属性文件中定义它们来覆盖 myapp-defaults.properties (在类路径中)中的值。从文件系统上的文件中获取属性的唯一方法是该属性未在类路径属性文件中定义。
我试过颠倒 order 属性无济于事(据我所知,这是正确的方法,较低的数字应该优先)。
我还尝试调试我的应用程序并在 Spring 源代码中的选定位置放置一个断点。我能够看到属性是从文件系统属性文件中加载的。当我注释掉类路径属性占位符时,我注意到文件系统属性文件正在正确加载,但是当变量值被打印出来时,它仍然具有类路径属性文件中定义的值。
我在这里真的很困惑。我在这里陷入了一些陷阱吗?