如果我具有通过容器(例如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

此属性将具有哪个值?myValueOnemyValueTwomyValueThree吗?

如果您有多个具有相同键的属性,那么是否存在一个层次结构来定义哪种类型的属性覆盖另一种类型的属性?

最佳答案

简而言之,这三个都将可用,您可以使用SpEL来获取每个值。

#{systemProperties['my.property']} // myValueOne
#{servletContextInitParams['my.property'] // myValueTwo

这些属性取决于您如何加载它们(@PropertySource或`

但是,您可能想知道如果使用占位符并且遇到这种情况会发生什么。
<property name="myProperty" value="${my.property}" />

假设您使用默认值(并且在Spring 3.1或更高版本上),请在基于Web的环境中按顺序查阅以下资源。
  • 属性文件
  • ServletConfig初始化参数(
  • ServletContext初始化参数
  • Jndi
  • 系统属性(由-D指定)
  • 环境属性

  • 因此,在您的情况下,${my.property}将解析为 myValueThree 。那就是如果您保留默认值。如果指定local-override="true",则最后查询属性文件,其值为 myValueTwo

    链接
  • StandardServletEnvironment javadoc
  • StandardEnvironment javadoc
  • PropertySourcesPlaceholderConfigurer javadoc
  • 09-09 22:34
    查看更多