必须用@ConditionalOnBean精确检测目标Bean是否已被加载进IOC容器,其在Bean定义阶段检查已注册的BeanDefinition列表,支持按type、name、annotation匹配,并可通过search、parameterizedContainer等参数定制行为。

要在Spring Boot中让某个Bean只在容器中已存在特定Bean时才注册,必须用@ConditionalOnBean精确检测目标Bean是否已被加载进IOC容器。
@ConditionalOnBean检测容器中Bean存在的核心机制
Spring Boot启动时,会按顺序执行Bean定义注册→Bean实例化→后置处理。@ConditionalOnBean在Bean定义阶段就介入判断——它不等待Bean真正被创建,而是检查当前已注册的BeanDefinition列表里是否存在匹配项。
匹配依据优先级为:type → name → annotation → search = CURRENT(默认仅查当前@Configuration类所在上下文)或 ALL(查整个父容器链)。
这一步操作起来很简单,直接把@ConditionalOnBean加在@Bean方法上就行,但要注意它只对当前配置类生效,不会跨@Configuration类自动感知。
三种指定目标Bean的方式
方法一:用Class类型指定
@ConditionalOnBean(DataSource.class) —— 这是最常用写法,Spring会查找所有类型为DataSource或其子类的BeanDefinition,只要有一个就满足条件。
方法二:用beanName字符串指定
@ConditionalOnBean(name = "dataSource") —— 必须严格匹配@Bean方法名或@Qualifier指定的名称,大小写敏感,且该名称在当前ApplicationContext中唯一。
【name值必须与@Bean方法名完全一致,否则判定失败】
方法三:用注解类型指定
@ConditionalOnBean(annotation = Repository.class) —— Spring扫描所有已注册的BeanDefinition,检查其对应类是否标注了@Repository注解。
关键参数组合与行为差异
第一步:设置search属性控制搜索范围
默认search = SearchStrategy.CURRENT,只查当前@Configuration类注册的Bean;若设为SearchStrategy.ALL,则向上遍历父ApplicationContext,包括Spring Boot自动配置类注册的Bean。
第二步:配合parameterizedContainer限定泛型类型
例如@ConditionalOnBean(value = List.class, parameterizedContainer = Collection.class)可匹配List
第三步:使用fallbackToDefaultTypeMatch关闭类型宽松匹配
默认开启,允许匹配子类;设为false后,只精确匹配声明的Class类型,不接受继承关系。
















