7
配置管理:application.yml 与多环境
Externalized Configuration
Spring Boot 配置外置:代码里不写死参数,全部放到配置文件。开发、测试、生产各一套 profile,启动时指定激活哪个。
| 文件 | 用途 |
|---|---|
application.yml | 公共配置,所有环境共享。 |
application-dev.yml | 开发环境,本地数据库、DEBUG 日志。 |
application-prod.yml | 生产环境,线上数据库、INFO 日志。 |
application-test.yml | 测试环境,测试库。 |
激活 profile:三种方式
# 方式一:application.yml 里写死(开发用)
spring:
profiles:
active: dev
# 方式二:启动命令行参数(生产推荐)
java -jar app.jar --spring.profiles.active=prod
# 方式三:环境变量
export SPRING_PROFILES_ACTIVE=prod
外部化配置优先级(高到低)
同一个配置项在多个地方出现时,Spring Boot 按下面的优先级选。排在上面的会覆盖下面的。
| 顺序 | 来源 | 例子 |
|---|---|---|
| 1 | 命令行参数 | java -jar app.jar --server.port=9090 |
| 2 | 操作系统环境变量 | export SERVER_PORT=9090 |
| 3 | application-{profile}.yml(打包外) | ./config/application-prod.yml |
| 4 | application-{profile}.yml(打包内) | jar 里的 prod 配置 |
| 5 | application.yml(打包外) | ./config/application.yml |
| 6 | application.yml(打包内) | jar 里的默认配置 |
| 7 | 代码里的默认值 | @Value 的冒号默认值 |
配置不生效?按优先级排一下
Spring Boot 配置优先级从高到低:命令行参数 > 环境变量 > application-{profile}.yml > application.yml > 默认值。你在 yml 里改了端口还是不生效,先检查是不是命令行参数或环境变量把它盖了。
本章面试题 · 第 7 章(配置管理)
1.(高频题)Spring Boot 的配置加载优先级,从高到低排一下。
查看答案
答案:命令行参数 > JNDI > 环境变量 > application-{profile}.yml > application.yml > @PropertySource > 默认值。解析:记住"命令行最霸道、环境变量其次、profile 配置盖默认配置"。改了不生效先往上找。
2.(理解题)@Value 和 @ConfigurationProperties 怎么选?
查看答案
答案:零散几个值用 @Value;一组相关配置(如数据库连接池参数、第三方 SDK 配置)用 @ConfigurationProperties 绑成一个对象,类型安全、可校验。解析:Boot 官方推荐后者,尤其配置项多的时候。