Spring
为自@PropertySources
以来标记为@Configuration
的所有类引入了新的注释4.0
。它需要不同的@PropertySource
作为参数。
@PropertySources({
@PropertySource("classpath:application.properties"), @PropertySource("file:/tmp/application.properties")})
我感兴趣的是知道多个属性文件中存在的相同键的值发生冲突时的排序。我没有看到任何与此相关的文档指定了排序。我已多次尝试,发现后面提到的PropertySource
会覆盖之前提到的PropertySource
中的值。但是,如何确定?
答案 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]'