SpringBoot多环境配置

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}.ymlapplication-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/Apollobootstrap-{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=prodCI/CD、Docker 启动
2application-{profile}.yml 存在且匹配
3SPRING_PROFILES_ACTIVE 环境变量export SPRING_PROFILES_ACTIVE=devLinux / Docker
4@SpringBootTest(properties = “spring.profiles.active=test”)测试类单元/集成测试
5spring.profiles.active=dev (写在 application.yml 中)不推荐容易误提交
6IDEA / 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. 快速自测清单

  1. application-prod.yml 的优先级比 application.yml 高吗?(是)
  2. 命令行 –spring.profiles.active=dev 和环境变量哪个优先?(命令行更高)
  3. 如何让 prod 和 gray 同时生效?(–spring.profiles.active=prod,gray)
  4. 生产环境密码最安全的几种写法?(环境变量 / Secret / 配置中心)
  5. Spring Boot 3.x 推荐的配置拆分方式?(spring.config.import)

如果你当前项目使用的是 Nacos / Apollo / Spring Cloud Config,或者想看 多模块项目Docker Compose + .envK8s ConfigMap + Secret 的具体写法,可以告诉我,我再给你针对性展开最实用的配置示例。

文章已创建 4026

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部