本专题导航
| 篇 | 主题 |
|---|---|
| 上一篇 | 入门与启动 |
| 本篇 | 配置与多环境 |
| 下一篇 | 自动配置与 Starter |
| Web、运维与测试 |
背景与动机
Spring Boot 把大量行为交给外部化配置。面试常问:application.yml 放哪、谁覆盖谁、dev/prod 怎么切换、@Value 和 @ConfigurationProperties 怎么选。本篇专门讲配置体系。
核心原理拆解
1. 配置文件格式
支持 properties 与 yml/yaml。YAML 层次清晰,适合多环境配置。
server: port: 8888app: name: my-service等价 properties:
server.port=8888app.name=my-service2. 配置加载途径与优先级(高 → 低)
- 命令行参数
java:comp/envJNDI- JVM 系统属性(
-D) - 操作系统环境变量
random.*随机属性- jar 外的
application.properties/yml - jar 内的
application.properties/yml @PropertySource- 默认属性
同一属性:高优先级覆盖低优先级。
3. 配置文件放置位置(高 → 低)
./config/- 当前运行目录
- classpath 的
config/ - classpath 根目录
自定义路径:
java -jar app.jar --spring.config.location=/path/application.yml4. bootstrap.yml 与 application.yml
bootstrap 优先于 application,常用于 Spring Cloud 连接配置中心时的引导配置(如 Nacos、Config Server 地址)。
5. 修改端口示例
server: port: 8888java -jar app.jar --server.port=8888java -Dserver.port=8888 -jar app.jar6. Spring Profiles 多环境
| 文件 | 用途 |
|---|---|
application.yml | 主配置 |
application-dev.yml | 开发 |
application-test.yml | 测试 |
application-prod.yml | 生产 |
激活方式:
spring: profiles: active: devjava -jar app.jar --spring.profiles.active=prod7. 读取配置的注解
| 方式 | 说明 |
|---|---|
@Value("${key}") | 注入单个属性,支持默认值 ${key:default} |
@ConfigurationProperties(prefix = "app") | 批量绑定前缀,适合多字段配置类 |
@PropertySource | 加载额外 properties 文件 |
Environment | 编程式读取 |
@ConfigurationProperties(prefix = "app")public class AppProperties { private String name; private int timeout; // getter/setter}需在配置类上 @EnableConfigurationProperties(AppProperties.class) 或给该类加 @Component。
常见陷阱与错误示例
1. 多环境配置未激活 profile
打 prod 包却带着 dev 数据源,上线即事故。CI/CD 中显式指定 spring.profiles.active=prod。
2. @Value 注入失败仍启动
拼写错误的 key 可能启动时报错;生产环境建议配合 @ConfigurationProperties + 校验或启动时检查必填项。
3. 把敏感信息写进仓库里的 yml
密码、密钥应走环境变量或配置中心,不要提交到 Git。
面试高频问题
完整 30 道速查见 Spring Boot 面试题 30 道。
一句话总结
配置记住三件事:优先级链、文件位置、Profiles;读配置优先 @ConfigurationProperties 管理一组属性,@Value 适合零散单项。