首页IT科技spring容器bean的注入过程(Spring bean注入问题:NoUniqueBeanDefinitionException解决方案归纳)

spring容器bean的注入过程(Spring bean注入问题:NoUniqueBeanDefinitionException解决方案归纳)

时间2025-05-02 00:06:34分类IT科技浏览4466
导读:引言...

引言

spring实现的bean自动注入在项目开发中是一个经常使用到的功能             ,但自动装配两个或多个bean时                  ,会抛出NoUniqueBeanDefinitionException:No qualifying bean of type com available: expected single matching bean but found 2异常             。最常见的现象就是一个接口有两个实现类                  。spring允许一个类创建两个或多个bean      。但如果bean是自动装配的      ,就会抛出异常          。

原因分析

spring应用程序启动时          ,应用程序将beans加载到ApplicationContext中                  ,接着添加依赖bean生成其他类型bean         ,如果两个或多个bean可用于为一个bean注入       ,则会抛出NoUniqueBeanDefinitionException:No qualifying bean of type com available: expected single matching bean but found异常                  。

异常演示

@Component public class Dog implements Animal{ @Override public String noise() { return "bowwow"; } }
@Component public class Bea implements Animal{ @Override public String noise() { return "buzz"; } }
@Service public class Zoo { @Autowired public Animal animal; }

如此                  ,工程启动便会抛出异常         。

解决方案

方案一

Autowired使用java约定变量名            ,如dog是Dog的约定变量名    ,所以                   ,使用注解@Autowired可以将Dog变量名命名为dog               ,如下

@Service public class Zoo { @Autowired public Animal dog; }

方案二

如果类的数据类型与加载的bean类型匹配,bean将会自动装载为对应的类型       。所以                ,不用接口或抽象类名定义bean,具体实现如下

@Service public class Zoo { @Autowired public Dog animal; }

方案三

可以使用注解@Primary                  ,Spring的@Primary注解   ,是框架在3.0版中引入的                  。其作用与功能             ,当有多个相同类型的bean时                  ,使用@Primary来赋予bean更高的优先级            。代码如下

@Component @Primary public class Dog implements Animal{ @Override public String noise() { return "bowwow"; } }

方案四

spring注解@Qualifier用于从多个bean中选择一个bean    。@Qualifier 注释将被配置为匹配 bean 名称                   。@Autowired 注释使用限定符的名称来匹配和加载 bean               。

@Service public class Zoo { @Autowired @Qualifier("dog") public Animal animal; }

方案五

限定符与方法参数一起使用。

@Service public class Zoo { private Animal animal; @Autowired public vod setAnimal(@Qualifier("dog") Animal animal){ this.animal = animal; } }
声明:本站所有文章      ,如无特殊说明或标注          ,均为本站原创发布                。任何个人或组织                  ,在未征得本站同意时         ,禁止复制            、盗用                   、采集      、发布本站内容到任何网站         、书籍等各类媒体平台                  。如若本站内容侵犯了原著者的合法权益       ,可联系我们进行处理   。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
在家做手工活挣钱无押金农村(自己在家做什么手工活赚钱-100个农村好项目(4):加工草头娃娃利润高,人人都能做) yolov5是什么语言写的(YOLOv5/v7/v8 改进首发最新PWConv核心结构|来自最新CVPR2023顶会,进一步轻量化!测试数据集mAP有效涨点,进一步降低参数量,追求更高的 FLOPS)