目录

Spring-Boot-加载配置文件的优先级

Spring Boot 加载配置文件的优先级

https://i-operation.csdnimg.cn/images/cf31225e169b4512917b2e77694eb0a2.pngSpring Boot配置加载优先级详解

在 Spring Boot 中,配置文件的加载优先级遵循一个明确的层次结构,当多个配置源存在时,后加载的配置会覆盖先加载的配置。以下是详细的优先级顺序(从低到高,即后面的会覆盖前面的):


1. 默认配置(最低优先级)

  • Spring Boot 内置的默认配置(如 spring-boot-autoconfigure 模块中的默认值)。

2. 外部化配置(按优先级从低到高)

(1) classpath 下的配置文件
  • classpath:/ 目录下的配置文件(如 application.properties 或 application.yml)。
  • 如果存在多个 Profile 特定的文件(如 application-dev.yml),需通过 spring.profiles.active 激活才会加载。
(2) classpath:/config/ 下的配置文件
  • classpath:/config/ 目录下的配置文件优先级高于 classpath:/ 下的文件。
(3) 文件系统当前目录的 config 子目录
  • 运行程序时的当前目录下的 config/ 目录中的配置文件(如 ./config/application.yml)。
(4) 文件系统当前目录
  • 运行程序时的当前目录下的配置文件(如 ./application.yml)。
(5) 通过 @PropertySource 注解加载的配置
  • 使用 @PropertySource 显式指定的配置文件路径(仅支持 .properties 文件,不支持 YAML)。

3. 命令行参数(较高优先级)

  • 通过命令行参数传递的配置(如 --server.port=8081)会覆盖所有文件配置。
  • 示例:

java -jar myapp.jar --server.port=8081

4. SPRING_APPLICATION_JSON 环境变量(高优先级)

  • 通过环境变量 SPRING_APPLICATION_JSON 传入的 JSON 格式配置(如 export SPRING_APPLICATION_JSON='{"server":{"port":9090}}')。

5. ServletConfig / ServletContext 初始化参数(Web 应用)

  • 仅适用于 Web 应用,通过 web.xml 或 ServletContext 设置的参数。

6. Java 系统属性(System.getProperties()

  • 通过 -D 参数设置的系统属性(如 -Dserver.port=8082)。

7. 随机值注入(RandomValuePropertySource

  • Spring Boot 提供的随机值(如 ${random.int})优先级较高,通常用于生成唯一值。

8. 操作系统环境变量

  • 通过操作系统环境变量设置的配置(如 export SERVER_PORT=8083,需注意变量名需转换为大写并用下划线分隔)。

9. 测试中的 @TestPropertySource(仅测试环境)

  • 在单元测试中,通过 @TestPropertySource 注解指定的配置文件优先级最高。

10. 最高优先级:@ConfigurationProperties 或 @Value 的硬编码默认值

  • 如果配置项在代码中通过 @Value("${key:defaultValue}") 设置了默认值,且其他配置源均未提供该值,则使用默认值。

Profile 特定配置的优先级

  • 当激活多个 Profile 时(如 spring.profiles.active=dev,prod),后声明的 Profile 优先级更高
    • application-prod.yml 会覆盖 application-dev.yml 中相同的配置。

示例场景

假设有以下配置文件和参数:

  1. classpath:/application.yml

    
    server:
      port: 8080
  2. classpath:/config/application.yml

    
    server:
      port: 8081
  3. 命令行参数:

    
    java -jar myapp.jar --server.port=8082

最终生效的端口8082(命令行参数覆盖所有文件配置)。


总结

Spring Boot 配置加载优先级的核心原则是:
“就近原则” + “后加载覆盖先加载”
开发者可以通过调整配置文件的位置、使用 Profile 或命令行参数灵活控制配置的覆盖行为。