@profile 注解用于控制bean在指定环境激活时才加载,需与spring.profiles.active配置一致(区分大小写),支持多环境、排除环境及配合application-{env}.yml使用。

@Profile 注解是 Spring 提供的环境感知机制,核心作用是让某些 Bean 只在指定环境激活时才被加载进容器。它不负责管理配置文件内容,而是控制“哪些组件该存在”,配合外部配置(如 application-dev.yml)使用效果更完整。
标注 Bean 并绑定环境标识
在 @Configuration 类中定义 Bean 时,直接用 @Profile 指定其生效环境:
- 写法示例:@Bean @Profile("dev") public DataSource devDataSource() { ... }
- 支持多个环境:@Profile({"dev", "test"}) 表示 dev 或 test 下都生效
- 排除某环境:@Profile("!prod") 表示非生产环境才加载
激活当前运行环境
必须显式告诉 Spring 当前用哪个 profile,否则默认只加载无 @Profile 标记或 @Profile("default") 的 Bean:
- 代码里设置:spring.profiles.active=dev 写在 application.yml 或 application.properties 中
- 启动时传参:java -jar app.jar --spring.profiles.active=test
- 系统属性:-Dspring.profiles.active=prod
- 环境变量:SPRING_PROFILES_ACTIVE=staging
配合多配置文件使用更自然
@Profile 常与命名规范的配置文件协同工作:
- 准备 application-dev.yml、application-prod.yml 等文件
- 主配置 application.yml 中只需写 spring.profiles.active: dev
- Spring 启动时自动加载 application.yml + application-dev.yml,并按需注入带 @Profile("dev") 的 Bean
注意 Profile 名称一致性
激活名和注解值必须完全匹配(区分大小写),常见错误包括:
- 配置写了 spring.profiles.active=development,但 Bean 标的是 @Profile("dev") → 不生效
- 误用空格:@Profile(" dev ") → 实际匹配的是带空格的字符串,失败
- 未设 active,又没定义 default profile → 所有 @Profile 标记的 Bean 都不会加载
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











