【问题标题】:Precedence of properties: system vs. deployment descriptor vs. properties file属性的优先级:系统与部署描述符与属性文件
【发布时间】:2014-03-10 10:05:30
【问题描述】:

如果我有系统属性,我会传递我的容器(例如 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 有趣的问题
  • 我重新表述了这个问题以使其更清楚。当然,如果三个属性的值都相同,那么属性解析的结果就很难验证了。

标签: java spring configuration


【解决方案1】:

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

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

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

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

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

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

  1. 属性文件
  2. ServletConfig 初始化参数 (
  3. ServletContext 初始化参数
  4. 金迪
  5. 系统属性(由-D指定)
  6. 环境属性

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

链接

  • StandardServletEnvironmentjavadoc
  • StandardEnvironmentjavadoc
  • PropertySourcesPlaceholderConfigurerjavadoc

【讨论】:

  • @MDeinum 你有官方资源吗? +1 顺便说一句。
  • @Eugene 添加了一些指向 javadoc 的链接。
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2014-05-02
  • 2012-10-02
  • 2015-08-01
  • 2015-08-17
  • 2015-08-24
相关资源
最近更新 更多