多个标注@ConditionalOnMissingBean的Bean哪个生效?如何控制优先级?
@ConditionalOnMissingBean 多Bean生效规则与优先级控制
最终生效的Bean判定规则
@ConditionalOnMissingBean 的核心逻辑是:只有当前Spring容器中不存在匹配的Bean时,才会注册被该注解标注的Bean。多个同匹配规则的该注解Bean最终谁生效,完全由Spring的Bean加载顺序决定:先被加载的Bean会成功注册到容器中,后加载的Bean检测到容器中已经存在匹配的Bean,就会直接跳过注册,不会生效。
控制加载优先级的常用方式
- 调整配置类加载顺序
普通配置类可以加@Order注解,Spring Boot自动配置类可以加@AutoConfigureOrder注解指定加载优先级,注解值越小优先级越高,优先级更高的配置类内部的Bean会先被加载。 - 精准指定匹配规则
默认@ConditionalOnMissingBean按Bean类型匹配,你可以通过name属性指定要匹配的Bean名称,仅当容器中不存在该名称的Bean时才注册当前Bean,避免同类型不同业务Bean的干扰,示例用法:@ConditionalOnMissingBean(name = "customUserService") @Bean public UserService userService() { return new DefaultUserService(); } - 用
@DependsOn强制依赖顺序
可以给Bean加@DependsOn("beanName")注解,强制当前Bean在指定的Bean加载完成之后再加载,间接调整注册顺序。 - 调整Bean覆盖配置
Spring Boot默认允许同名Bean覆盖,你可以通过配置spring.main.allow-bean-definition-overriding=false关闭该规则,避免后加载的Bean意外覆盖先加载的同名称Bean,也方便排查加载顺序异常问题。 - 配合
@Primary调整注入优先级
如果出现同类型多个Bean都被注册的场景,标注了@Primary的Bean会被作为自动注入的首选,这个属于注入阶段的优先级,和注册阶段的@ConditionalOnMissingBean配合可以实现更灵活的Bean选择逻辑。
内容的提问来源于stack exchange,提问作者belowfox
相关产品推荐
相关产品推荐

