Spring-Boot-加载配置文件的优先级
目录
Spring Boot 加载配置文件的优先级
Spring 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
中相同的配置。
示例场景
假设有以下配置文件和参数:
classpath:/application.yml
:server: port: 8080
classpath:/config/application.yml
:server: port: 8081
命令行参数:
java -jar myapp.jar --server.port=8082
最终生效的端口:8082
(命令行参数覆盖所有文件配置)。
总结
Spring Boot 配置加载优先级的核心原则是:
“就近原则” + “后加载覆盖先加载”。
开发者可以通过调整配置文件的位置、使用 Profile 或命令行参数灵活控制配置的覆盖行为。