Spring Boot 多环境配置 是实际项目中最常用、最核心的配置管理方式之一。
下面从最实用的角度,完整梳理 Spring Boot(2.x / 3.x)多环境配置的各种实现方式、优先级、推荐做法,以及常见踩坑点。
1. 多环境配置的核心思路
Spring Boot 的核心理念是:同一套代码 + 不同的配置文件 = 适配不同环境(dev、test、prod、gray 等)。
最常用的几种环境:
- dev(开发环境)
- test(测试环境)
- sit(集成测试环境)
- uat(用户验收测试)
- prod(生产环境)
- gray(灰度/预发布)
2. 主流实现方式对比(2025 年推荐顺序)
| 方式 | 配置文件命名 | 激活方式 | 推荐指数 | 适用场景 | 备注 |
|---|---|---|---|---|---|
| application-{profile}.yml | application-dev.yml application-prod.yml | –spring.profiles.active=dev | ★★★★★ | 最推荐 | 清晰、主流、Spring Boot 官方首推 |
| application.yml + spring.profiles.include | — | 在主文件中 include | ★★★★☆ | 少量差异 | 适合公共配置 + 少量环境差异 |
| application.yml + 多 profile 块 | — | spring.profiles: dev | ★★★☆☆ | 历史项目 | 不推荐新项目 |
| application-{profile}.properties | 同上 | 同上 | ★★★☆☆ | 老项目迁移 | yml 更现代 |
| bootstrap.yml + Nacos/Apollo | bootstrap-{profile}.yml | — | ★★★★☆ | 分布式配置中心 | 动态刷新场景 |
| @ConfigurationProperties + @Profile | 代码中定义 Bean | @Profile(“dev”) | ★★★☆☆ | 特殊 Bean | 代码级别切换 |
2025 年最推荐写法:application-{profile}.yml + application.yml
3. 推荐的项目结构(最常用)
src/main/resources
├── application.yml ← 公共配置(所有环境都生效)
├── application-dev.yml ← 开发环境
├── application-test.yml ← 测试环境
├── application-sit.yml
├── application-uat.yml
├── application-prod.yml ← 生产环境(最严格)
└── application-gray.yml ← 灰度环境(可选)
application.yml(公共部分)
spring:
application:
name: mall-order
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
application-dev.yml(开发环境覆盖/补充)
spring:
datasource:
url: jdbc:mysql://192.168.1.100:3306/mall_dev?useSSL=false&serverTimezone=Asia/Shanghai
username: dev_user
password: dev123
server:
port: 8081
logging:
level:
com.example.mall: debug
application-prod.yml(生产环境)
spring:
datasource:
url: jdbc:mysql://prod-mysql-01:3306/mall_prod?useSSL=true
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
server:
port: 80
management:
endpoints:
web:
exposure:
include: health,info,prometheus
4. 激活 profile 的 6 种常用方式(优先级从高到低)
| 优先级 | 方式 | 示例 | 场景 |
|---|---|---|---|
| 1 | 命令行参数(最高优先级) | java -jar app.jar –spring.profiles.active=prod | CI/CD、Docker 启动 |
| 2 | application-{profile}.yml 存在且匹配 | — | — |
| 3 | SPRING_PROFILES_ACTIVE 环境变量 | export SPRING_PROFILES_ACTIVE=dev | Linux / Docker |
| 4 | @SpringBootTest(properties = “spring.profiles.active=test”) | 测试类 | 单元/集成测试 |
| 5 | spring.profiles.active=dev (写在 application.yml 中) | 不推荐 | 容易误提交 |
| 6 | IDEA / VSCode 运行配置 | Active profiles: dev | 本地开发 |
最常用组合:
- 本地开发:IDEA 设置 Active profiles = dev
- 容器/K8s 部署:环境变量 SPRING_PROFILES_ACTIVE=prod
- Jenkins/GitHub Actions:–spring.profiles.active=${ENV}
5. 进阶写法(生产项目常用)
5.1 多 profile 同时激活(Spring Boot 2.4+)
--spring.profiles.active=prod,gray,featureX
application-gray.yml 会覆盖 application-prod.yml 中相同的配置。
5.2 使用 ${} 占位符 + 环境变量(推荐生产)
spring:
datasource:
username: ${DB_USERNAME:default_user}
password: ${DB_PASSWORD:}
Docker / K8s 中注入:
env:
- name: DB_USERNAME
value: "prod_user"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
5.3 分组配置(Spring Boot 3.2+ 推荐)
spring:
config:
import:
- optional:classpath:/config/application-kafka.yml
- optional:classpath:/config/application-redis.yml
6. 常见踩坑 & 最佳实践
| 问题 | 错误做法 | 正确/推荐做法 |
|---|---|---|
| 生产配置泄露 | 把 prod 密码写死在 git | 使用环境变量 / 配置中心 / Jasypt 加密 |
| 忘记切换 profile | 本地跑出 prod 数据 | 本地强制 dev + 测试类加 @ActiveProfiles |
| 多 profile 覆盖顺序混乱 | — | 记住:后激活的 profile 优先级更高 |
| yml 缩进错误 | — | 用 IDEA 的 Spring Assistant 插件校验 |
| 敏感信息明文 | password: 123456 | 必须用 ${} 或配置中心 |
| 测试环境没 mock | — | 使用 @TestPropertySource 或 testcontainers |
7. 快速自测清单
- application-prod.yml 的优先级比 application.yml 高吗?(是)
- 命令行 –spring.profiles.active=dev 和环境变量哪个优先?(命令行更高)
- 如何让 prod 和 gray 同时生效?(–spring.profiles.active=prod,gray)
- 生产环境密码最安全的几种写法?(环境变量 / Secret / 配置中心)
- Spring Boot 3.x 推荐的配置拆分方式?(spring.config.import)
如果你当前项目使用的是 Nacos / Apollo / Spring Cloud Config,或者想看 多模块项目、Docker Compose + .env、K8s ConfigMap + Secret 的具体写法,可以告诉我,我再给你针对性展开最实用的配置示例。