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>
- 核心记忆:它是一个编译期的说明书生成器,不参与运行。
- 它到底干了啥:
- 扫描所有
@ConfigurationProperties类 - 生成
META-INF/spring-configuration-metadata.json - 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 资源过滤常用 @…@,不要把构建期过滤与运行时 ${…} 混为一谈。