目录
1.@ConditionalOnBean
1.1、作用
1.2、使用场景
2. @ConditionalOnMissingBean
2.1、作用
2.2、使用场景
3. 两者结合使用
4. 高级用法:
5. 注意事项
6. 实际应用场景
前言
在 Spring 框架中,@
ConditionalOnBean 和 @
ConditionalOnMissingBean 是两个常用的条件注解,用于根据容器中是否存在特定的 Bean 来决定是否创建当前的 Bean。
它们常用于 自动配置(Auto-Configuration)中,帮助开发者实现灵活的条件化配置。
关于springboot的自动装配可参考:谈谈对Springboot框架的理解-CSDN博客
1.@ConditionalOnBean
面试过程中,经常会被问题到。
1.1、作用
当 Spring 容器中存在某个 Bean(或满足某些条件的 Bean)时,才会创建当前 Bean。
1.2、使用场景
- 如果用户已经手动配置了一个 DataSource,则不再需要自动配置默认的 DataSource。
- 当某个功能模块依赖某个服务 Bean 存在时,才启用该模块。
示例
@Configuration
public class DataSourceAutoConfig {// 只有当容器中存在 MyDataSource 时,才会创建 JdbcTemplate@Bean@ConditionalOnBean(MyDataSource.class)public JdbcTemplate jdbcTemplate(MyDataSource dataSource) {return new JdbcTemplate(dataSource);}
}
📝 说明
- 如果用户在配置中定义了 MyDataSource,则 JdbcTemplate 会被自动创建。
- 如果没有定义 MyDataSource,JdbcTemplate 不会被创建。
2. @ConditionalOnMissingBean
面试过程中,经常会被问题到。
2.1、作用
当 Spring 容器中不存在某个 Bean(或满足某些条件的 Bean)时,才会创建当前 Bean。
2.2、使用场景
- 如果用户没有手动配置某个 Bean,则提供一个默认实现。
- 避免重复创建相同类型的 Bean。
✅ 示例
@Configuration
public class DataSourceAutoConfig {// 只有当容器中不存在 DataSource 时,才会创建默认的 HikariDataSource@Bean@ConditionalOnMissingBeanpublic DataSource dataSource() {return new HikariDataSource(); // 默认数据源}
}
📝 说明
- 如果用户没有定义自己的 DataSource,则会创建默认的 HikariDataSource。
- 如果用户已经定义了自己的 DataSource,则不会创建默认的。
3. 两者结合使用
✅ 示例
@Configuration
public class ServiceAutoConfig {// 只有当容器中存在 RedisTemplate 时,才会创建 RedisService@Bean@ConditionalOnBean(RedisTemplate.class)public RedisService redisService(RedisTemplate redisTemplate) {return new RedisService(redisTemplate);}// 只有当容器中没有定义 CacheService 时,才会创建默认的 CacheServiceImpl@Bean@ConditionalOnMissingBeanpublic CacheService cacheService() {return new CacheServiceImpl();}
}
📝 说明
- 如果用户配置了 RedisTemplate,则会自动创建 RedisService。
- 如果用户没有配置 CacheService,则会创建默认的 CacheServiceImpl。
4. 高级用法:
指定 Bean 名称或类型
✅ 示例
@Bean
@ConditionalOnBean(name = "customDataSource")
public JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);
}
📝 说明
- 只有当容器中存在名为 customDataSource 的 Bean 时,才会创建 JdbcTemplate。
5. 注意事项
如下图所示:
具体如下图所示:
6. 实际应用场景
📚 总结
这两个注解是 Spring Boot 自动配置机制 的基石,通过灵活组合可以实现高度可定制的配置逻辑。掌握它们的使用,能够显著提升 Spring Boot 应用的灵活性和可维护性。