Spring Boot Profiles 环境隔离
Profiles 体系在 Spring Boot 整体结构中的位置、激活机制与 Environment 抽象,见 Spring Boot 主脉络。
Profiles 在企业级项目配置分层中的具体实践,见 企业级项目实践指导手册。
一、Profiles 是什么
Profiles 是 Spring Boot 提供的环境隔离机制,实现开发、测试、生产环境配置相互隔离,启动时按需激活,无需修改业务代码。
适用场景:
- 开发环境使用本地数据库,生产环境使用云端数据库
- 开发环境开启调试日志,生产环境关闭冗余日志
Profiles 的底层支撑是 Spring Framework 的 Environment 抽象与
@Profile条件化注册机制,见 Spring Framework 核心体系。
二、配置文件命名规范
Spring Boot 自动识别规范命名配置文件,按规则合并加载:
| 配置文件名称 | 作用 | 激活方式 |
|---|---|---|
application.yml(主配置) | 全局通用配置,所有环境共享 | 默认自动加载,无需激活 |
application-{profile}.yml | 环境专属配置(dev/test/prod) | 需要通过 spring.profiles.active 激活 |
示例文件:
- 开发环境:application-dev.yml
- 测试环境:application-test.yml
- 生产环境:application-prod.yml
三、三种激活 Profiles 方式
优先级从高到低
1. 命令行激活
最高优先级,生产部署推荐
启动 jar 时传入参数,覆盖配置文件内的激活设置
# 激活单个生产环境
java -jar your-app.jar --spring.profiles.active=prod
# 同时激活多个环境,逗号分隔;后置环境同名配置会覆盖前置
java -jar your-app.jar --spring.profiles.active=prod,metrics
2. 配置文件激活
本地开发调试使用
在 application.yml内指定默认环境
spring:
profiles:
active: dev
3. 代码编程式激活
较少使用,适合动态场景
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class YourAppApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(YourAppApplication.class);
// 指定激活环境
app.setAdditionalProfiles("prod");
app.run(args);
}
}
四、配置加载优先级规则
优先级自上而下,下方配置可被上方配置同名属性覆盖
| 配置来源 | 优先级 | 示例 | 特点 |
|---|---|---|---|
| 命令行参数 | 最高 | --spring.profiles.active=prod、--server.port=80 | 部署灵活,生产环境首选 |
| 操作系统环境变量 | 次高 | SPRING_PROFILES_ACTIVE=prod | Docker/K8s 容器部署常用 |
Jar包外部 application-{profile}.yml | 中高 | 外置 application-prod.yml | 无需重新打包,可直接修改生产配置 |
Jar包内部 application-{profile}.yml | 中 | 内置 application-prod.yml | 打包固化,无法外部修改 |
Jar包外部 application.yml | 中低 | 外置主配置文件 | 全局通用配置支持外置 |
Jar包内部 application.yml | 最低 | 内置主配置 | 项目基础默认配置 |
五、高级用法:Profile 分组
当需要同时激活多个独立配置环境时,可以定义环境分组,简化启动参数。
在 application.yml 主配置中定义分组:
spring:
profiles:
group:
production: # 自定义分组名称
- proddb # 数据库配置环境
- prodmq # 消息队列配置环境
启动只需指定分组名称,自动加载组内所有环境:
java -jar your-app.jar --spring.profiles.active=production
六、@Profile 注解:按环境选择性加载Bean
不仅可以隔离配置文件,还能控制 Bean、配置类是否随环境加载。
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* 仅 production 环境生效
*/
@Configuration
@Profile("production")
public class ProductionConfig {
}
/**
* ! 代表取反,除production外所有环境生效
*/
@Configuration
@Profile("!production")
public class DevTestConfig {
}
七、注意事项
spring.profiles.active、spring.profiles.include、spring.profiles.group只能写在主配置application.yml,禁止写在application-dev.yml这类环境专属配置文件;- profile 名称默认存在字符校验;需要特殊字符时关闭校验:
spring:
profiles:
validate: false
- 多环境同时激活顺序:
dev,prod,后面环境的同名配置覆盖前面; - 主配置
application.yml所有环境都会加载,环境专属配置是增量覆盖,不是替代。
八、使用建议
- 使用流程:创建
application-{profile}.yml→ 激活对应环境 → 配置自动合并覆盖; - 标准实践:dev/test/prod 三套环境,本地开发在配置文件激活 dev,生产启动使用命令行指定 prod;
- 进阶方案:Profile 分组简化多环境激活,
@Profile实现 Bean 环境隔离。