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

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

时间2025-08-03 22:24:21分类IT科技浏览5336
导读:引言...

引言

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
小米路由器青春版是多少兆的(79元小米路由器青春版信号怎么样?小米路由器青春版拆解图赏) SEO优化:远不止排名