JOURNAL / WORDS & IDEAS

Spring Boot 配置绑定:Properties 与 YAML

记录配置文件、ConfigurationProperties、环境变量和构建期过滤的区别。

阅读设置

记忆总图:把配置玩明白的一条龙

定义配置类  →  给IDE加提示  →  写多环境文件  →  打包带走
    ↓               ↓               ↓              ↓
@ConfigurationProperties  processor  application-{profile}  build配置

下面我分块总结,每个块都提炼关键词和核心要点。


一、用类来承载配置:@ConfigurationProperties

关键词:@ConfigurationProperties(prefix = "developer")

  • 作用:把 application.yml 里一组相关属性自动绑定到一个 Java 对象上。
  • 怎么记:就像“模具”,定义一个类,属性名和配置文件里的 key 对应,Spring Boot 会自动把值“浇铸”进去。
  • 用法:
@ConfigurationProperties(prefix = "developer")
public class DeveloperProperties {
    private String name;
    private int age;
    // getter & setter 必须
}
  • 激活:在主类或配置类上加 @EnableConfigurationProperties(DeveloperProperties.class)。
  • 好处:告别到处 @Value,集中管理,类型安全。

你提到的 Dict.create().set 可能是一种流式构建配置的写法,在某些工具类里用来动态创建字典或属性源,但不是 Spring Boot 标准的配置绑定方式。如果你的项目里真用了这个,可以告诉我上下文,我再专门解释。


二、让配置写起来有智能提示:spring-boot-configuration-processor

关键词:<optional>true</optional>、META-INF 元数据

  • 依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

  • 核心记忆:它是一个编译期的说明书生成器,不参与运行。
  • 它到底干了啥:
    1. 扫描所有 @ConfigurationProperties 类
    2. 生成 META-INF/spring-configuration-metadata.json
    3. IDE 读取这个 JSON,你在写 application.yml 时就有属性名自动补全、文档悬浮提示
  • optional 含义:这个处理器只在你自己的项目里需要,别人依赖你的 jar 时没必要带过去,避免污染。
  • 验证:编译后看看 target/classes/META-INF 下有没有那个 json,再试试在 yml 里输入 developer. 能不能触发提示。

三、多环境切换:三个 application 文件

关键词:application.yml、application-dev.yml、application-prod.yml、spring.profiles.active

  • 文件职责:
    • application.yml:放公共配置 + 激活哪个环境(spring.profiles.active: dev)
    • application-dev.yml:开发环境专属(本地数据库、debug日志)
    • application-prod.yml:生产环境专属(真实数据库、warn日志)
  • 切换方式:
    • 配置文件里写死 spring.profiles.active (开发时常用)
    • 启动命令 --spring.profiles.active=prod
    • 环境变量 SPRING_PROFILES_ACTIVE=prod
  • 记忆口诀:“一公多专,活跃切换” —— 一个公共文件,多个专属文件,用 active 指定当前活跃。
  • 最佳实践:生产敏感信息(如密码)不要明文写在文件里,而用 ${DB_PASSWORD} 占位,通过环境变量注入。

这就是你说的“三个application文件”,绝对不是指 additional-spring-configuration-metadata.json,那个只是元数据,和运行时配置无关。


四、打包配置:<build> 里的三员大将

关键词:finalName、spring-boot-maven-plugin、filtering

你给出的这段 build 配置,每一项都有明确职责:

<build>
    <finalName>demo-properties</finalName>        <!-- 1. 固定包名 -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>  <!-- 2. 打Fat Jar -->
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>           <!-- 3. 资源变量替换 -->
        </resource>
    </resources>
</build>

配置项 作用 记忆点
<finalName> 生成固定的 JAR 名,如 demo-properties.jar 拒绝版本号在文件名里捣乱
spring-boot-maven-plugin 打出包含所有依赖的可执行 JAR 必备,缺了就跑不起来
<filtering>true</filtering> 打包时把资源文件里的 ${...} 占位符替换成 Maven 属性 常用来注入版本号、环境标识

串联:如果你在 application.yml 里写了 ${project.version},开启 filtering 后,打包就会自动替换成 pom.xml 里的版本号,这就是过滤的威力。


整体记忆路线图

1. 写 Java 配置类 (@ConfigurationProperties)  ← 定义数据结构
       ↓
2. 加 processor 依赖 (optional)               ← 让 IDE 认识它
       ↓
3. 准备多套 application-{profile}.yml         ← 分环境给值
       ↓
4. 配置 build (finalName + 插件 + 过滤)       ← 打包成可执行的、文件名固定的、占位符已替换的制品
       ↓
5. 运行时通过 spring.profiles.active 切换环境

关键区分(最容易混淆的):

  • META-INF 的 json = 给 IDE 看的配置菜单,删了不影响运行。
  • application-dev/prod.yml = 真正的不同环境配置值,运行时起效。
  • filtering = 打包时替换占位符,和 Profile 是两回事,但可以配合使用。

配置边界补充

configuration-processor 主要生成配置元数据,不负责运行时注册 Bean。ConfigurationProperties 类需通过扫描、EnableConfigurationProperties 或合适的组件注册方式加入容器。JavaBean 绑定和构造器绑定的访问器要求不同;使用 Spring Boot parent 时 Maven 资源过滤常用 @…@,不要把构建期过滤与运行时 ${…} 混为一谈。