Spring Boot 的外化配置加载顺序遵循特定的优先级规则,高优先级的配置会覆盖低优先级的。以下是详细的配置源加载顺序及规则:
一、配置源的优先级(从高到低)
-
命令行参数
通过--key=value
传递的参数,如java -jar app.jar --server.port=8081
。 -
SPRING_APPLICATION_JSON
属性
通过环境变量或系统属性传递的 JSON 格式配置,如SPRING_APPLICATION_JSON='{"server":{"port":8081}}'
。 -
Java 系统属性
使用-D
参数设置的属性,如-Dserver.port=8081
。 -
操作系统环境变量
如SERVER_PORT=8081
。 -
Profile-Specific 配置文件(外部)
位于项目外部的application-{profile}.properties
或 YAML 文件(如./config/application-dev.yml
)。 -
Profile-Specific 配置文件(内部)
位于项目内部的application-{profile}.properties
或 YAML 文件(如classpath:/application-dev.yml
)。 -
常规配置文件(外部)
项目外部的application.properties
或 YAML 文件(如./config/application.yml
)。 -
常规配置文件(内部)
项目内部的application.properties
或 YAML 文件(如classpath:/application.yml
)。 -
@PropertySource
注解
通过@PropertySource
加载的配置文件。 -
默认属性
通过SpringApplication.setDefaultProperties()
设置的默认属性。
二、配置文件的位置优先级
Spring Boot 会从以下位置按顺序加载配置文件(优先级从高到低):
-
当前目录的
/config
子目录
file:./config/
-
当前目录
file:./
-
Classpath 的
/config
包
classpath:/config/
-
Classpath 根目录
classpath:/
同一位置的加载顺序:
先加载
application.properties
,再加载application.yml
。若激活了 Profile(如
dev
),则加载application-{profile}.properties
或yml
,覆盖默认配置。
三、覆盖规则
-
高优先级位置 > 低优先级位置
例如,外部的file:./config/application.properties
会覆盖内部的classpath:/application.properties
。 -
同一位置下,Profile-Specific 配置 > 默认配置
例如,file:./config/application-dev.yml
会覆盖同位置的file:./config/application.yml
。 -
非配置文件源 > 配置文件源
如命令行参数、环境变量等优先级高于所有配置文件。
四、示例说明
假设以下配置存在:
-
命令行参数:
--server.port=8081
-
外部文件
./config/application.yml
:server.port: 8082
-
内部文件
classpath:/application-dev.yml
(激活dev
Profile):server.port: 8083
最终生效的端口为 8081
(命令行参数优先级最高)。
五、高级配置
-
自定义配置文件路径
通过--spring.config.location=classpath:/custom/
或spring.config.additional-location
指定额外路径。 -
多文档 YAML 文件
在单个 YAML 文件中使用---
分隔符定义不同 Profile 的配置(需 Spring Boot 2.4+)。
总结
Spring Boot 的配置加载顺序以“就近覆盖”为原则,同时支持灵活的外部化配置。理解这一机制有助于在不同环境(开发、测试、生产)中高效管理配置。