引言

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异常。

异常演示

public interface Animal {
public String noise();
}
@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;
}
}

  

 
 

Spring bean注入问题:NoUniqueBeanDefinitionException解决方案归纳的更多相关文章

  1. [spring]Bean注入——在XML中配置

    Bean注入的方式有两种: 一.在XML中配置 属性注入 构造函数注入 工厂方法注入 二.使用注解的方式注入@Autowired,@Resource,@Required 本文首先讲解在XML中配置的注 ...

  2. Spring bean注入方式

    版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html  Spring bean提供了3中注入方式:属 ...

  3. spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)

    这里不介绍原理,只是记录自己spring+cxf的开发过程和遇到的问题 场景:第三方公司需要调用我们的业务系统,以xml报文的形式传递数据,之后我们解析报文存储到我们数据库生成业务单据: WebSer ...

  4. spring bean 注入

    概念 http://developer.51cto.com/art/200610/33311.htm http://kb.cnblogs.com/page/45266/ ==https://www.c ...

  5. Spring Bean 注入 2 注解篇

    1. 自动装配注解 配置applicationContext.xml开启注解 <?xml version="1.0" encoding="UTF-8"?& ...

  6. Spring Bean 注入 1 - 构造方法注入,属性注入,自动装配

    1.代码结构图 xxx 2.bean代码 package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * D ...

  7. [spring]Bean注入——使用注解代替xml配置

    使用注解编程,主要是为了替代xml文件,使开发更加快速. 一.使用注解前提: <?xml version="1.0" encoding="UTF-8"?& ...

  8. Spring bean注入

    1.构造方法注入 1.bean类 public class User { private String name; private Integer age; private Cat cat; publ ...

  9. Spring JMX之一:使用JMX管理Spring Bean

    spring中关于jmx包括几个概念: MBeanExporter: 从字面上很容易理解, 用来将一些spring的bean作为MBean暴露给MBEanServer.MBeanServerFacto ...

  10. 在非spring组件中注入spring bean

    1.在spring中配置如下<context:spring-configured/>     <context:load-time-weaver aspectj-weaving=&q ...

随机推荐

  1. HTML学习笔记1----HTML是什么

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  2. XJTUOJ #1193. 表象[弹幕偏执症]

    题目 https://oj.xjtuicpc.com/problem/1193 恋恋天下第一!(然而本菜鸡总是被阿空锤死而根本开不了normal)TAT 思路 挺吓人的一道题,看起来很像是要匹配加字符 ...

  3. java 动手动脑 方法重载

    如下代码://MethodOverload.java //Using overloaded methods package HJssss; public class zhuce { public st ...

  4. redis info 对应参数详解

    https://blog.csdn.net/qq_27342265/article/details/123094422 info命令的使用方法有以下三种: info:部分Redis系统状态统计信息.i ...

  5. ElementUI实现手动上传

    在做项目中,与同事遇到问题,顺手记录一下 <template> <div class="common-layout"> <el-button size ...

  6. 某个灰产远程调用的script源码

    访问一个老域名,可能是释放了被所灰产的的注册了,跳转简单扒下他们的源码. 主要是三段script代码,第一段是百度自动推送代码,第二段是站长统计代码,第三段则是远程调用断码. <html xml ...

  7. jadx 定位方法

    目录 链接参数定位 链接参数定位 通过搜索请求链接中的参数来定位函数位置,如下图所示,请求链接为 https://www.python-spider.com/api/app1,app1为链接标识,可以 ...

  8. 部署及配置Mycat数据库中间件

    Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.PostgreSQL等DB的常见SQL语法遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用 ...

  9. 记事本默认编码改为UTF-8

    前端时间发现用记事本直接创建的记录目标信息的TXT文本再用sublime打开变成了乱码,才发现编码有问题,记事本直接创建的文本编码竟然是ANSI编码. 于是动手将记事本默认编码改为UTF-8. 记事本 ...

  10. react module.scss文件中弹窗中 keyframes动画不生效,

    以下修改,亲测有效非弹窗内动画写法 .submit_btn{   animation: submit_btn 1.5s infinite;     -webkit-animation: submit_ ...