PropertySources中各种来源的优先权

时间:2015-08-27 13:56:01

标签: java spring spring-mvc spring-4

Spring为自@PropertySources以来标记为@Configuration的所有类引入了新的注释4.0。它需要不同的@PropertySource作为参数。

@PropertySources({
    @PropertySource("classpath:application.properties"), @PropertySource("file:/tmp/application.properties")})

我感兴趣的是知道多个属性文件中存在的相同键的值发生冲突时的排序。我没有看到任何与此相关的文档指定了排序。我已多次尝试,发现后面提到的PropertySource会覆盖之前提到的PropertySource中的值。但是,如何确定?

3 个答案:

答案 0 :(得分:3)

@PropertySources的文档没有说明多个@PropertySource文件中存在相同属性的情况。

但是,@ PropertyTource的文档说明如下:

  

如果给定的属性键存在于多个中   .properties文件,最后处理的@PropertySource注释将会   '赢得'并覆盖

由于@PropertySources中的@PropertySource声明实际上是一个表,因此可以相当安全地假设最后声明的@PropertySource覆盖了之前的声明。这与我已经完成的测试以及此blog post一致。

但是,正如问题中所述,文档中没有明确说明。因此,这种行为可能会意外地导致#34;改变未来。

答案 1 :(得分:1)

HL'REB是正确的。从最后一个属性文件中“赢得”该参数。但是,application.properties会覆盖所有值。检查了SPRING 5.1.6。

答案 2 :(得分:0)

根据我的测试,@PropertySource批注中的@PropertySources批注似乎按照它们出现的顺序进行处理,但是如果您set up a listener,它们的打印顺序将相反

注释:

@Configuration
@PropertySources({
  @PropertySource(value = "classpath:application.global.properties"),
  @PropertySource(
      value = "classpath:application.client-specific.properties",
      ignoreResourceNotFound = true),
  @PropertySource(
      value = "file:/etc/omnia/application.client-specific.properties",
      ignoreResourceNotFound = true),
  @PropertySource(value = "classpath:application.test.properties", ignoreResourceNotFound = true)
})

和日志输出:

Loading @PropertySource: 'configurationProperties'
Loading @PropertySource: 'servletConfigInitParams'
Loading @PropertySource: 'servletContextInitParams'
Loading @PropertySource: 'systemProperties'
Loading @PropertySource: 'systemEnvironment'
Loading @PropertySource: 'random'
Loading @PropertySource: 'URL [file:/etc/omnia/application.client-specific.properties]'
Loading @PropertySource: 'class path resource [application.global.properties]'