<p>Spring Boot 通过多环境 YAML 配置文件实现配置分离与按需加载,核心是 Profile 机制、YAML 结构优势和 @ConfigurationProperties 类型安全绑定;推荐使用 application-{profile}.yml 拆分,或单文件内用 --- 分隔多 profile 区块,并注意空格缩进、冒号后空格及配置优先级。</p>

Spring Boot 通过多环境 YAML 配置文件简化属性管理,核心在于分离配置、按需加载、类型安全绑定。不是靠写一堆 if-else 或硬编码判断环境,而是利用 Spring 的 Profile 机制 + YAML 的结构优势 + Java Bean 映射,让不同环境的配置互不干扰、可复用、易维护。
用 application-{profile}.yml 拆分环境配置
这是最常用也最推荐的方式。把开发、测试、生产等环境的差异项单独抽成独立文件:
-
application.yml:放所有环境共用的配置(如 server.port、logging.level),并指定默认激活的 profile,例如:
spring.profiles.active: dev - application-dev.yml:只写开发环境特有内容,比如本地数据库地址、开启调试日志、mock 服务开关
- application-prod.yml:只写生产环境敏感项,如真实数据库 URL、连接池大小、关闭 trace 日志
启动时加参数 -Dspring.profiles.active=prod,Spring Boot 就自动合并 application.yml + application-prod.yml,后者覆盖前者同名属性。
用 --- 在单个 YAML 文件内划分多环境块
适合配置项不多、团队倾向“一文件管所有”的场景。一个 application.yml 写完全部:
立即学习“Java免费学习笔记(深入)”;
- 用
---分隔不同 profile 区块,每个区块开头声明spring: profiles: dev
或prod - 注意:只有被激活的 profile 对应区块才会生效,其他区块被忽略
- 示例片段:
server:
port: 8080
---
spring:
profiles: dev
datasource:
url: jdbc:h2:mem:testdb
username: sa
---
spring:
profiles: prod
datasource:
url: ${DB_URL}
username: ${DB_USER}用 @ConfigurationProperties 绑定配置到 Java 类
避免零散使用 @Value 注入,把一组相关配置封装成 POJO,提升可读性和校验能力:
- 新建一个类(如
AppConfig),加上@ConfigurationProperties(prefix = "app") - YAML 中写:
app: name: myapp timeout: 5000 features: - login - payment - 类里用
@Data(Lombok)或手动写 getter/setter,字段名与 YAML 键严格对应 - 在启动类或配置类上加
@EnableConfigurationProperties(AppConfig.class),即可注入使用
注意几个关键细节
实际落地时容易踩坑的地方:
-
冒号后必须空格:写
port:8080会报错,正确是port: 8080 - 缩进只能用空格,不能用 Tab:IDE 建议设为 “indent using spaces”,缩进不齐会导致解析失败
-
优先级顺序固定:同目录下
application.properties > application.yml > application.yaml,别混用格式 -
Maven 打包时 profile 要对齐:如果 pom.xml 用
<profile>指定了 active,Spring Boot 启动时以 Maven 的为准,不是 application.yml 里写的


















