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

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

时间2025-06-20 05:25:35分类IT科技浏览4985
导读:引言...

引言

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
mlt框架(用Meteor框架快速搭建高质量互联网应用)