spring boot 2.2 中 yaml 配置必须严格遵循缩进规则和多文档分隔规范(---后顶格写spring.profiles),否则 profile 激活失效、配置不合并。

在 Spring Boot 2.2 版本中使用 Starter 时,YAML 配置需同时满足语法严谨性与多文档合并逻辑,否则 profile 激活失效、
正确书写 YAML 多文档块(--- 分隔)
用三个短横线 【---】 明确分隔不同环境配置块,不能写成 -- 或 ----,也不能在 --- 前后加空格或换行符。
在 application.yml 文件顶部直接写:---
server:
port: 8080
spring:
profiles:
active: dev
---
spring:
profiles: dev
logging:
level:
root: DEBUG
---
spring:
profiles: prod
logging:
level:
root: WARN
启用
Spring Boot 2.2 自带的 YamlProcessor 默认不执行
必须手动替换为 SnakeYAML 的 SafeConstructor,并启用递归引用支持:
LoaderOptions options = new LoaderOptions();
options.setAllowRecursiveKeys(true);
Yaml yaml = new Yaml(new SafeConstructor(options));
【不这样做,所有
Starter 中读取 YAML 的两种路径
方法一:通过 @ConfigurationProperties 绑定嵌套结构
定义类:
@ConfigurationProperties("app.datasource")
@Data
public class DataSourceConfig {
private String url;
private String username;
private List
}
application.yml 中对应写:
app:
datasource:
url: jdbc:mysql://localhost/test
username: root
hosts:
- 192.168.1.10
- 192.168.1.11
方法二:用 Environment 直接 getProperty 提取扁平键
String port = environment.getProperty("server.port");
String firstHost = environment.getProperty("app.datasource.hosts[0]");
注意:getProperty 不支持自动类型转换,返回值需自行 parse,比如 getRequiredInt() 才能转整型。
多 YAML 文件合并顺序与覆盖规则
第一步:Spring Boot 按固定顺序加载配置文件:
classpath:/application.yml → classpath:/application-{profile}.yml → file:./config/application.yml → file:./config/application-{profile}.yml
第二步:同名 key 发生覆盖时,后加载的文件优先级更高;但数组类属性(如 logging.level)是完全替换而非合并。
第三步:若需保留多个文件中的 list 元素,必须改用 map 结构模拟集合,例如:
features:
auth: true
cache: false
monitoring: true
这样可被不同 profile 文件分别设置部分字段,避免 list 被整段覆盖。











