如果我具有通过容器(例如Tomcat)传递的系统属性,如下所示:
-Dmy.property=myValueOne
以及在我的web.xml中定义的具有相同键的属性:
<context-param>
<param-name>my.property</param-name>
<param-value>myValueTwo</param-value>
</context-param>
...以及在我的config * .properties文件之一中定义的具有相同键的属性:
my.property=myValueThree
此属性将具有哪个值?
myValueOne
,myValueTwo
或myValueThree
吗?如果您有多个具有相同键的属性,那么是否存在一个层次结构来定义哪种类型的属性覆盖另一种类型的属性?
最佳答案
简而言之,这三个都将可用,您可以使用SpEL来获取每个值。
#{systemProperties['my.property']} // myValueOne
#{servletContextInitParams['my.property'] // myValueTwo
这些属性取决于您如何加载它们(
@PropertySource
或`但是,您可能想知道如果使用占位符并且遇到这种情况会发生什么。
<property name="myProperty" value="${my.property}" />
假设您使用默认值(并且在Spring 3.1或更高版本上),请在基于Web的环境中按顺序查阅以下资源。
因此,在您的情况下,
${my.property}
将解析为 myValueThree 。那就是如果您保留默认值。如果指定local-override="true"
,则最后查询属性文件,其值为 myValueTwo 。链接
StandardServletEnvironment
javadoc StandardEnvironment
javadoc PropertySourcesPlaceholderConfigurer
javadoc