在实际项目开发中,不同环境往往有不同的配置需求:
- 开发环境(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 启动时的配置加载顺序为:
application.yml
(通用配置);application-{profile}.yml
(根据激活 profile 加载);- 命令行参数 > 环境变量 > profile 文件内容
✅ profile 文件会覆盖主配置文件中的同名字段。
五、实战示例:开发 vs 测试 vs 生产配置对比
1. application.yml(通用配置)
spring: application: name: my-app datasource: driver-class-name: com.mysql.cj.jdbc.Driver
2. application-dev.yml
spring: datasource: url: jdbc:mysql://localhost:3306/dev_db username: dev_user password: 123456 thymeleaf: cache: false # 开发时关闭缓存
3. application-test.yml
spring: datasource: url: jdbc:mysql://localhost:3306/test_db username: test_user password: 654321
4. application-prod.yml
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。
-Dspring.profiles.active=dev
问题三:打包部署时 profile 无法切换?
当你将应用打成 jar 包后上传服务器,建议通过 命令行方式 激活 profile:
java -jar app.jar --spring.profiles.active=prod
或者写入 application.properties
覆盖默认激活配置:
spring.profiles.active=prod
问题四:不想分太多文件,可以使用 profile 分段写法
Spring Boot 支持使用 YAML 中的 ---
语法来在一个文件中定义多个 profile:
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 的加载:
@Configuration
@Profile("dev")
public class DevDataSourceConfig { // dev 环境下的数据源配置
}
@Configuration
@Profile("prod")
public class ProdDataSourceConfig { // prod 环境下的数据源配置
}
⚠️ 注意:未被激活的 profile 中的 Bean 不会被加载。
八、部署建议与最佳实践
建议 | 说明 |
---|---|
拆分配置文件 | 每个环境单独管理,清晰明确 |
生产配置不要上传代码仓库 | 密码信息敏感,建议放置服务器本地配置 |
使用命令行指定 profile | 灵活、避免被代码覆盖 |
开发阶段关闭缓存 | 便于调试,如 Thymeleaf |
生产阶段提高日志等级 | 避免输出大量调试信息 |
九、总结
- Spring Boot 提供了强大灵活的多环境配置能力;
- 推荐使用
application-{profile}.yml
结构划分配置; - 激活方式可通过
application.yml
、命令行参数、VM 参数等; - 结合
@Profile
注解可实现 Bean 的按需加载; - 合理配置有助于保障开发、测试和生产环境各自的稳定性和安全性。