PropertySources中各种源的优先级

azi*_*azi 5 java spring spring-mvc spring-4

Spring公司推出了新的注释@PropertySources对标记为所有类@Configuration4.0。它采用不同的@PropertySource参数。

@PropertySources({
    @PropertySource("classpath:application.properties"), @PropertySource("file:/tmp/application.properties")})
Run Code Online (Sandbox Code Playgroud)

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

HL'*_*REB 6

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

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

如果给定的属性键存在于多个 .properties 文件中,最后处理的 @PropertySource 注释将“获胜”并覆盖

由于@PropertySources 中的@PropertySource 声明实际上是一个表,因此可以相当安全地假设最后声明的@PropertySource 覆盖了之前的声明。这与我所做的测试和这篇博客文章一致

但是,正如问题中提到的,文档中没有明确指出。因此,该行为将来可能会“意外”改变。

  • 顺便说一句,“在某些情况下,在使用 \@ProperySource 注释时严格控制属性源排序可能是不可能或不切实际的。例如,如果上面的 \@Configuration 类是通过组件扫描注册的,则排序很难预测。在这种情况下 - 如果覆盖很重要 - 建议用户回退到使用编程 PropertySource API。有关详细信息,请参阅 ConfigurableEnvironment 和 MutablePropertySources javadocs。 (2认同)

小智 5

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