Spring 通过 @Profile 注解按环境条件化注册 Bean,支持单 profile、多 profile(如{"dev","test"})、取反(如"!prod")及 default 回退;需显式激活 profile(如 application.properties 中设置 spring.profiles.active=dev),并可结合 profiles.include 或 profiles.group 实现配置复用与分组管理。

Spring 使用 @Profile 注解按环境加载不同 Bean,核心是通过激活特定 profile 控制 Bean 的注册与否。
指定 Bean 所属的 Profile
在类或方法上添加 @Profile,标明该 Bean 只在指定 profile 激活时才被 Spring 容器创建:
- 作用在类上:
@Profile("dev") public class DevDataSourceConfig { ... } - 作用在
@Bean方法上:@Profile("prod") @Bean DataSource dataSource() { ... } - 支持逻辑表达式:
@Profile({"dev", "test"})表示 dev 或 test 环境都生效;@Profile("!prod")表示非 prod 环境生效
激活当前运行的 Profile
必须显式激活 profile,否则带 @Profile 的 Bean 不会加载。常用方式有:
- JVM 参数:
-Dspring.profiles.active=dev - application.properties:
spring.profiles.active=dev(可配多个,用逗号分隔:dev,swagger) - 代码方式(较少用):
context.getEnvironment().setActiveProfiles("dev"); - 测试中用
@ActiveProfiles("test")注解指定测试使用的 profile
默认 Profile 和 fallback 场景
可以用 @Profile("default") 标记兜底 Bean,当没有激活任何 profile 时它才会生效:
- 例如:定义一个通用配置类加
@Profile("default"),再为 dev/prod 各自定义专用配置类 - 注意:
default不是自动激活的 profile,只有当spring.profiles.active为空时才触发 - 若同时设置了 active profile 和 default Bean,active 的优先,default 不生效
配合配置文件使用更清晰
推荐将不同环境的配置拆到独立文件(如 application-dev.yml),并在主配置中用 spring.profiles.include 或 spring.profiles.group 组织:
-
spring.profiles.include: common,dev—— 自动包含 common 和 dev 配置 -
spring.profiles.group.dev: common,dev-datasource,dev-logging—— 将 dev 分组关联多个 profile - 这样既能复用公共配置,又能保持 Bean 层级的 profile 控制逻辑清晰


















