手机版

@ConditionalOnMissingBean何时触发

时间:2026-08-27 282
@ConditionalOnMissingBean在BeanDefinition注册前触发,仅当目标Bean尚未被注册时生效。它依据search策略检查已注册BeanDefinition、父容器及@Import导入的Bean,匹配类型或名称,未找到则执行@Bean方法,否则静默跳过。

当Spring容器在注册Bean前检查到目标类型或名称的Bean尚未存在时,@ConditionalOnMissingBean才会触发并允许当前@Bean方法执行。

触发时机:BeanDefinition注册前

Spring在解析@Configuration类生成BeanDefinition的过程中,对每个加了@ConditionalOnMissingBean的方法执行条件判断。这一步发生在Bean实例化之前,且仅在容器尝试注册该BeanDefinition时发生。

它不会在应用启动完成后再扫描、也不会在@Autowired注入时动态判断——错过这个窗口期,注解就彻底失效了。

触发前提:目标Bean尚未被注册

方法1:检查范围包括已加载的BeanDefinition、父容器中已存在的Bean、以及通过@Import导入的Bean。

方法2:若目标Bean已被其他配置类(如用户自定义的@Configuration)提前注册,则当前@ConditionalOnMissingBean标注的@Bean直接跳过,不报错也不覆盖。

【注意:包扫描顺序和配置类加载顺序会影响结果】 比如common模块的自动配置类若比业务模块的自定义配置类先被Spring扫描到,就可能误判为“缺失”,导致默认Bean被注册;反之则不会触发。

触发验证流程

第一步:Spring解析到@Bean方法上的@ConditionalOnMissingBean注解,提取其value、name、search等属性。

第二步:根据search策略(默认CURRENT,即仅查当前上下文),遍历所有已注册的BeanDefinition,比对类型匹配(isAssignableFrom)或名称精确匹配。

第三步:若未找到任何匹配项,则条件成立,继续执行该@Bean方法并注册返回的实例;否则整个方法体被跳过,不生成BeanDefinition。

这一步没有日志输出,也不抛异常,静默跳过是它的正常行为。

女子学校安检员安卓最新版
6.0
模拟经营 20 MB
扫一扫手机安装更便捷