@profile 是 spring 中按环境条件性加载 bean 的核心注解,支持声明、激活、组合及默认配置。

在 Spring 中,@Profile 是控制 Bean 按环境条件性加载的核心注解。它让开发、测试、生产等不同环境使用各自专属的配置(比如数据库连接、日志级别、Mock 服务),避免硬编码或手动切换。
1. 声明 Profile 并标注 Bean
用 @Profile("dev")、@Profile("prod") 等标注类或方法,表示该 Bean 只在对应 profile 激活时才被 Spring 容器注册:
@Component
@Profile("dev")
public class DevDataSourceConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource(); // 开发用轻量连接池
}
}
@Component
@Profile("prod")
public class ProdDataSourceConfig {
@Bean
public DataSource dataSource() {
return new DruidDataSource(); // 生产用带监控的连接池
}
}
也可以作用于单个 @Bean 方法:
@Configuration
public class DatabaseConfig {
@Bean
@Profile("test")
public DataSource h2DataSource() {
return new H2DataSource(); // 测试用内存数据库
}
@Bean
@Profile("!test") // 非 test 环境才生效
public DataSource realDataSource() {
return new DruidDataSource();
}
}
2. 激活指定 Profile
Spring 启动时需明确告诉容器“当前用哪个 profile”,否则默认不激活任何 profile(此时带 @Profile 的 Bean 全部忽略):
- 代码中设置:
System.setProperty("spring.profiles.active", "dev");(必须在SpringApplication.run()前调用) - 启动参数:
--spring.profiles.active=prod - application.properties:
spring.profiles.active=dev,uat(支持多个,用逗号分隔) - 环境变量:
SPRING_PROFILES_ACTIVE=prod
注意:若同时通过多种方式设置,优先级从高到低为 — 启动参数 > 环境变量 > properties 文件 > 代码设置。
3. Profile 组合与条件表达式
@Profile 支持逻辑组合,便于管理复杂环境规则:
-
@Profile("dev && !local"):同时满足 dev 且不是 local -
@Profile("dev || test"):dev 或 test 任一激活即生效 -
@Profile({"dev", "test"}):等价于dev || test,更常用
还可以配合 @ConditionalOnProperty 或自定义 @Conditional 实现更细粒度控制(比如“只有开启缓存开关且是 prod 环境才加载 RedisTemplate”)。
4. 默认 Profile 和 fallback 设计
用 @Profile("default") 标注兜底 Bean,当没有显式激活任何 profile 时启用:
@Bean
@Profile("default")
public CacheManager defaultCacheManager() {
return new SimpleCacheManager(); // 内存缓存,适合本地调试
}
@Bean
@Profile("prod")
public CacheManager redisCacheManager(RedisConnectionFactory factory) {
return RedisCacheManager.builder(factory).build();
}
也可设多个默认项,但建议只保留一个清晰的 fallback 路径,避免歧义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











