1. 概述
配置 Spring 应用有多种方式,YAML 配置文件是其中一种常用方案。
本文将演示如何通过 YAML 为 Spring Boot 应用配置不同环境参数,重点解决多环境配置的痛点。
2. Spring YAML 文件
Spring profiles 机制允许应用为不同环境定义专属配置。下面是一个包含两个 profile 的 YAML 文件示例:
注意:三个连字符 ---
用于分隔不同 profile,使多个 profile 能共存于同一文件。
文件路径:/myApplication/src/main/resources/application.yml
spring:
config:
activate:
on-profile: test
name: test-YAML
environment: testing
enabled: false
servers:
- www.abc.test.com
- www.xyz.test.com
---
spring:
config:
activate:
on-profile: prod
name: prod-YAML
environment: production
enabled: true
servers:
- www.abc.com
- www.xyz.com
⚠️ 重要提醒:此配置不会自动激活任何 profile!必须显式指定,否则仅加载 default
profile。
3. 绑定 YAML 到配置类
将 YAML 属性映射到 Java 对象需创建配置类:
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class YAMLConfig {
private String name;
private String environment;
private boolean enabled;
private List<String> servers = new ArrayList<>();
// 标准 getter/setter 方法
}
注解说明:
@Configuration
:声明为 Spring 配置类@ConfigurationProperties
:绑定外部配置属性@EnableConfigurationProperties
:启用@ConfigurationProperties
注解支持
4. 访问 YAML 属性
通过注入 YAMLConfig
实例访问属性。首先激活指定 profile:
在 application.properties
中设置:
spring.profiles.active=prod
使用 CommandLineRunner
验证配置加载:
@SpringBootApplication
public class MyApplication implements CommandLineRunner {
@Autowired
private YAMLConfig myConfig;
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Override
public void run(String... args) {
System.out.println("当前环境: " + myConfig.getEnvironment());
System.out.println("应用名称: " + myConfig.getName());
System.out.println("功能开关:" + myConfig.isEnabled());
System.out.println("服务器列表: " + myConfig.getServers());
}
}
控制台输出:
当前环境: production
应用名称: prod-YAML
功能开关: true
服务器列表: [www.abc.com, www.xyz.com]
5. YAML 属性覆盖规则
Spring Boot 中 YAML 文件的覆盖优先级需特别注意:
✅ Spring Boot 2.4+ 版本规则:
- 外部配置文件(JAR 包外)始终覆盖内部文件
- 无论是否为 profile 特定配置,外部文件优先级更高
❌ 旧版本(2.4 之前)优先级(从高到低):
- JAR 包外的 profile 配置
- JAR 包内的 profile 配置
- JAR 包外的应用配置
- JAR 包内的应用配置
6. 总结
本文系统讲解了 Spring Boot 中 YAML 配置的核心要点:
- 多环境配置实现方案
- 配置类绑定机制
- 属性访问方式
- 属性覆盖优先级规则
完整代码示例可在 GitHub 获取。