12、多环境配置

在实际项目开发中,不同环境往往有不同的配置需求:

  • 开发环境(dev):本地调试,连接测试数据库;
  • 测试环境(test):接口联调,接近真实场景;
  • 生产环境(prod):性能稳定,关闭调试信息。

一、什么是多环境配置?

Spring Boot 支持通过 application-{profile}.yml 来定义多个环境下的配置文件,然后通过激活不同的 profile,切换当前应用使用的配置。

常见环境划分

环境 用途
dev 本地开发环境
test 联调/测试环境
prod 正式上线环境
uat 用户验收环境(可选)

二、多环境配置的结构设计

推荐采用如下结构组织配置文件:

复制代码
src/  
└── main/  
└── resources/  
├── application.yml  
├── application-dev.yml  
├── application-test.yml  
└── application-prod.yml

各文件职责

  • application.yml通用配置,所有环境共享;
  • application-dev.yml:开发环境特有配置;
  • application-test.yml:测试环境配置;
  • application-prod.yml:生产环境配置;

三、如何激活环境配置

方式一:在 application.yml 中设置

复制代码
spring:  
  profiles:  
    active: dev

方式二:命令行参数指定(常用于部署)

复制代码
java -jar app.jar --spring.profiles.active=prod

方式三:IDE 配置 VM 参数

在运行配置中添加:

复制代码
-Dspring.profiles.active=dev

四、配置继承与覆盖逻辑

Spring Boot 启动时的配置加载顺序为:

  1. application.yml(通用配置);
  2. application-{profile}.yml(根据激活 profile 加载);
  3. 命令行参数 > 环境变量 > profile 文件内容

profile 文件会覆盖主配置文件中的同名字段。

五、实战示例:开发 vs 测试 vs 生产配置对比

1. application.yml(通用配置)

java 复制代码
spring:  
  application:  
    name: my-app  
  datasource:  
    driver-class-name: com.mysql.cj.jdbc.Driver

2. application-dev.yml

java 复制代码
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/dev_db  
    username: dev_user  
    password: 123456  
  thymeleaf:  
    cache: false  # 开发时关闭缓存

3. application-test.yml

java 复制代码
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/test_db  
    username: test_user  
    password: 654321

4. application-prod.yml

java 复制代码
spring:  
  datasource:  
    url: jdbc:mysql://192.168.1.100:3306/prod_db  
    username: prod_user  
    password: prod_password  
  thymeleaf:  
    cache: true  
  logging:  
    level:  
      root: info

六、环境切换中的常见问题与解决方案

问题一:配置未生效?

排查点:

  • spring.profiles.active 是否配置正确;
  • 环境配置文件是否命名准确(如 application-dev.yml);
  • 是否被其它配置(命令行/环境变量)覆盖。

问题二:IDE 启动环境总是 default

在 IDEA 中运行时,如果没有配置 VM 参数或 YAML 设置,默认使用的是 application.yml,不包含子 profile。

java 复制代码
-Dspring.profiles.active=dev

问题三:打包部署时 profile 无法切换?

当你将应用打成 jar 包后上传服务器,建议通过 命令行方式 激活 profile:

java 复制代码
java -jar app.jar --spring.profiles.active=prod

或者写入 application.properties 覆盖默认激活配置:

java 复制代码
spring.profiles.active=prod

问题四:不想分太多文件,可以使用 profile 分段写法

Spring Boot 支持使用 YAML 中的 --- 语法来在一个文件中定义多个 profile:

java 复制代码
spring:  
  application:  
    name: my-app  
  
---  
spring:  
  config:  
    activate:  
      on-profile: dev  
  datasource:  
    url: jdbc:mysql://localhost:3306/dev_db  
  
---  
spring:  
  config:  
    activate:  
      on-profile: prod  
  datasource:  
    url: jdbc:mysql://localhost:3306/prod_db

七、进阶技巧:结合 @Profile 注解使用

在代码中我们可以通过 @Profile 注解控制 Bean 的加载:

java 复制代码
@Configuration  
@Profile("dev")  
public class DevDataSourceConfig {  
    // dev 环境下的数据源配置  
}
java 复制代码
@Configuration  
@Profile("prod")  
public class ProdDataSourceConfig {  
    // prod 环境下的数据源配置  
}

⚠️ 注意:未被激活的 profile 中的 Bean 不会被加载。

八、部署建议与最佳实践

建议 说明
拆分配置文件 每个环境单独管理,清晰明确
生产配置不要上传代码仓库 密码信息敏感,建议放置服务器本地配置
使用命令行指定 profile 灵活、避免被代码覆盖
开发阶段关闭缓存 便于调试,如 Thymeleaf
生产阶段提高日志等级 避免输出大量调试信息

九、总结

  • Spring Boot 提供了强大灵活的多环境配置能力;
  • 推荐使用 application-{profile}.yml 结构划分配置;
  • 激活方式可通过 application.yml、命令行参数、VM 参数等;
  • 结合 @Profile 注解可实现 Bean 的按需加载;
  • 合理配置有助于保障开发、测试和生产环境各自的稳定性和安全性。
相关推荐
trayvontang7 小时前
Spring属性自动配置原理与自定义转换
spring boot·spring·spring属性自动配置·spring转换原理·spring自定义属性转换器
袁煦丞 cpolar内网穿透实验室7 小时前
无需公网 IP 也能全球访问本地服务?cpolar+Spring Boot+Vue应用实践!
vue.js·spring boot·tcp/ip·远程工作·内网穿透·cpolar
幽络源小助理7 小时前
SpringBoot+Vue雅苑小区管理系统源码 | Java物业项目免费下载 – 幽络源
java·vue.js·spring boot
weixin_425023008 小时前
多内网服务器公网中转通信方案(Spring Boot 2.7 + MyBatis Plus)
服务器·spring boot·mybatis
DYS_房东的猫8 小时前
Spring Boot集成华为云OBS实现文件上传与预览功能(含安全下载)
java·spring boot
小王师傅668 小时前
【轻松入门SpringBoot】actuator健康检查(中)-group,livenessState,readinessState
java·spring boot·后端
计算机毕设指导68 小时前
基于微信小程序的旅游线路定制系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·旅游
qq_12498707539 小时前
基于Spring Boot的微信小程序的智慧商场系统的设计与实现
java·spring boot·spring·微信小程序·小程序·毕业设计·计算机毕业设计
椰羊~王小美9 小时前
通用的导入、导出方法
java·spring boot
幽络源小助理9 小时前
SpringBoot+Vue多维分类知识管理系统源码 | Java知识库项目免费下载 – 幽络源
java·vue.js·spring boot