Spring Boot 中的 @ConditionalOnBean 注解详解
Spring Boot 的 @ConditionalOnBean 注解用于在容器中指定 Bean 存在时注册当前 Bean。支持通过 value/type 指定类型,name 指定名称,annotation 指定注解,search 指定搜索范围。常用于按需加载数据库 Bean、启用自动配置及处理可选依赖。与 @ConditionalOnMissingBean 相反,后者用于 Bean 不存在时注册。

Spring Boot 的 @ConditionalOnBean 注解用于在容器中指定 Bean 存在时注册当前 Bean。支持通过 value/type 指定类型,name 指定名称,annotation 指定注解,search 指定搜索范围。常用于按需加载数据库 Bean、启用自动配置及处理可选依赖。与 @ConditionalOnMissingBean 相反,后者用于 Bean 不存在时注册。

在 Spring Boot 中,条件注解(Conditional 注解)是一种强大的功能,允许我们根据某些条件动态地注册或跳过特定的 Bean。其中,@ConditionalOnBean 是最常用的条件注解之一,它的作用是:当 Spring 容器中存在指定的 Bean 时,当前 Bean 才会被注册。
@ConditionalOnBean 作用与基本用法@ConditionalOnBean 的作用@ConditionalOnBean 主要用于以下场景:
@ConditionalOnBean 确保它不会因缺少依赖而加载失败。DataSource Bean 存在时,才创建 MyService Beanimport org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class MyConfig {
@Bean
public DataSource dataSource() {
// 这里模拟 DataSource 实例,实际可用 HikariDataSource、Druid 等
return new FakeDataSource();
}
@Bean
@ConditionalOnBean(DataSource.class)
// 仅当 DataSource 存在时,才创建 MyService
public MyService myService() {
return new MyService();
}
}
class MyService {
public MyService() {
System.out.println("MyService 被创建");
}
}
class FakeDataSource implements DataSource {
// 这里可以模拟 DataSource 方法
}
执行结果:
MyService 被创建
如果 dataSource() 方法被注释掉,则 MyService 不会被创建。
@ConditionalOnBean 详解@ConditionalOnBean 提供了多个属性,可以更加灵活地控制 Bean 的创建。
value 和 type 属性(指定 Bean 类型)用于指定某种类型的 Bean 存在时,当前 Bean 才会被注册。
@Bean
@ConditionalOnBean(value = DataSource.class)
// 仅当 DataSource 存在时生效
public MyRepository myRepository() {
return new MyRepository();
}
等效于:
@Bean
@ConditionalOnBean(type = "javax.sql.DataSource")
// 使用全限定类名
public MyRepository myRepository() {
return new MyRepository();
}
区别:
value:直接使用 Class 类型,编译时检查更安全。type:使用字符串,可用于避免某些类找不到(如可选依赖)。name 属性(指定 Bean 名称)用于 指定某个 Bean 名称是否存在 来决定当前 Bean 是否加载。
@Bean
@ConditionalOnBean(name = "customBean")
// 仅当名为 customBean 的 Bean 存在时注册
public MyComponent myComponent() {
return new MyComponent();
}
annotation 属性(指定 Bean 需要标注的注解)可以指定某些 Bean 是否包含特定注解,如果包含,则当前 Bean 才会被注册。
@Bean
@ConditionalOnBean(annotation = Repository.class)
// 仅当存在 @Repository 注解的 Bean 时生效
public MyService myService() {
return new MyService();
}
search 属性(搜索范围)默认情况下,@ConditionalOnBean 只会在 当前应用上下文 中查找 Bean,而不会查找 父上下文(即 Spring Boot 的 ApplicationContext 层级)。
search 选项可以指定搜索范围:
ALL:在所有父子 ApplicationContext 中搜索。CURRENT(默认):仅搜索当前 ApplicationContext。@Bean
@ConditionalOnBean(value = DataSource.class, search = SearchStrategy.ALL)
// 在所有上下文中搜索
public MyService myService() {
return new MyService();
}
@ConditionalOnBean 使用场景如果应用程序中 使用了数据库,则提供一个 DatabaseService,否则不创建:
@Bean
@ConditionalOnBean(DataSource.class)
public DatabaseService databaseService() {
return new DatabaseService();
}
Spring Boot 的 spring-boot-autoconfigure 模块大量使用 @ConditionalOnBean 来控制自动配置。例如:
DispatcherServlet 存在时,Spring MVC 相关的自动配置才会生效。@Configuration
@ConditionalOnBean(DispatcherServlet.class)
public class MvcAutoConfiguration {
// 仅当 DispatcherServlet 存在时,Spring MVC 配置生效
}
有时,某些功能是可选的,比如当 Redis 组件存在时,才创建缓存管理器:
@Bean
@ConditionalOnBean(name = "redisTemplate")
// 只有当 redisTemplate 存在时才加载
public CacheManager cacheManager() {
return new RedisCacheManager();
}
@ConditionalOnBean vs @ConditionalOnMissingBean| 注解 | 作用 |
|---|---|
@ConditionalOnBean | 当指定 Bean 存在时,才注册当前 Bean |
@ConditionalOnMissingBean | 当指定 Bean 不存在时,才注册当前 Bean |
示例:
@Bean
@ConditionalOnMissingBean(DataSource.class)
// 仅当 DataSource 不存在时才创建
public DataSource defaultDataSource() {
return new DefaultDataSource();
}
在 Spring Boot 中,@ConditionalOnBean 可以帮助我们根据 是否存在特定 Bean 来 动态注册 Bean,广泛用于 按需加载、自动配置 等场景。
✅ 指定 Bean 类型:@ConditionalOnBean(DataSource.class)
✅ 指定 Bean 名称:@ConditionalOnBean(name = "customBean")
✅ 指定 Bean 注解:@ConditionalOnBean(annotation = Repository.class)
✅ 搜索范围:@ConditionalOnBean(search = SearchStrategy.ALL)

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online