Spring Cloud Config 中属性的加载优先级是多少?

2022-09-03 07:51:59

Spring对外化配置的加载有明确的顺序。

  1. Devtools 全局设置属性位于主目录上(~/.spring-boot-devtools.properties,当 devtools 处于活动状态时)。
  2. 在测试上@TestPropertySource注释。
  3. @SpringBootTest#属性批注特性测试。
  4. 命令行参数。
  5. SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联 JSON)。
  6. ServletConfig init parameters.
  7. ServletContext init parameters.
  8. 来自 java:comp/env 的 JNDI 属性。
  9. Java System properties (System.getProperties())。
  10. 操作系统环境变量。
  11. 一个 RandomValuePropertySource,它的属性仅以 random.*为单位。
  12. 打包 jar 外部特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)。
  13. 特定于配置文件的应用程序属性打包在 jar 中(application-{profile}.properties 和 YAML 变体)。
  14. 打包 jar 外部的应用程序属性(application.properties 和 YAML 变体)。
  15. 打包在 jar 中的应用程序属性(application.properties 和 YAML 变体)。
  16. @PropertySource@Configuration类的注释。
  17. 默认属性(通过设置 SpringApplication.setDefaultProperties 指定)。

但是,对于来自Spring Cloud Config的配置,似乎有一个明显的遗漏。有谁知道Spring Cloud Config适合上面的位置吗?


答案 1

正如其他人所说,配置服务器是第一位的。如果您尝试用本地属性(即 )覆盖配置服务器的属性,则需要向配置服务器**添加两个属性:application-local.yml

spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true

根据文档

引导上下文添加到应用程序中的属性源通常是“远程”的(例如,从配置服务器),默认情况下,它们不能在本地覆盖。如果要允许应用程序使用其自己的系统属性或配置文件覆盖远程属性,则远程属性源必须通过设置 spring.cloud.config.allowOverride=true 来授予其权限(在本地设置此属性不起作用)。设置该标志后,有一些更细粒度的设置来控制与系统属性和应用程序的本地配置相关的远程属性的位置:spring.cloud.config.overrideNone=true以覆盖任何本地属性源,如果只有系统属性和env vars应该覆盖远程设置,而不是本地配置文件,则spring.cloud.config.overrideSystemProperties=false。

另请参阅此内容,了解如何通过系统/命令行属性进行覆盖。上面引用的文档有/有不一致的地方,我从引用中删除了它。spring.cloud.config.override-system-properties=false

请注意,如果希望远程配置服务器覆盖本地属性文件源,但不覆盖本地系统属性或环境属性,请在配置服务器中添加以下内容:

spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=false
spring.cloud.config.overrideSystemProperties=false

** 在这种情况下,将忽略该值。看overrideSystemPropertiesorg.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration#insertPropertySources

注意:上述所有内容都适用于 Spring Boot 2.3.x.版本 2.4.x 使用备用加载优先级。查看 https://github.com/spring-cloud/spring-cloud-config/issues/1856


答案 2

该文档指出:

引导属性在 /env 终结点中显示为高优先级属性源,如下面的示例所示

所以这将是位置#0


推荐