属性的优先级:系统与部署描述符与属性文件

时间:2014-03-10 10:05:31

标签: java spring configuration

如果我有系统属性,我通过我的容器(例如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

如果您有多个具有相同键的属性,是否有一个层次结构来定义哪种属性会覆盖哪种其他属性?

1 个答案:

答案 0 :(得分:4)

简单地说,这三个都可用,您可以使用SpEL获取每个值。

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

属性取决于您加载它们的方式(@PropertySource或`

但是,您可能想知道如果使用占位符会发生什么情况,并且您已经拥有了这种情况。

<property name="myProperty" value="${my.property}" />

假设您使用默认值(并且在Spring 3.1或更高版本上),则在基于Web的环境中按顺序查阅以下资源。

  1. 属性文件
  2. ServletConfig Init Params(
  3. ServletContext Init Params
  4. JNDI
  5. 系统属性(由-D指定)
  6. 环境属性
  7. 因此,在您的情况下,${my.property}将解析为 myValueThree 。也就是说,如果保留默认值。如果指定local-override="true",则最后查询属性文件,值为 myValueTwo

    链接

    • StandardServletEnvironment javadoc
    • StandardEnvironment javadoc
    • PropertySourcesPlaceholderConfigurer javadoc