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+ 版本规则

  1. 外部配置文件(JAR 包外)始终覆盖内部文件
  2. 无论是否为 profile 特定配置,外部文件优先级更高

旧版本(2.4 之前)优先级(从高到低):

  1. JAR 包外的 profile 配置
  2. JAR 包内的 profile 配置
  3. JAR 包外的应用配置
  4. JAR 包内的应用配置

6. 总结

本文系统讲解了 Spring Boot 中 YAML 配置的核心要点:

  • 多环境配置实现方案
  • 配置类绑定机制
  • 属性访问方式
  • 属性覆盖优先级规则

完整代码示例可在 GitHub 获取。


原始标题:Spring YAML Configuration | Baeldung