@Autowired是spring的注解,默认使用的是byType的方式向Bean里面注入相应的Bean。例如:
@Autowired
private UserService userService;
这段代码会在初始化的时候,在spring容器中寻找一个类型为UserService的bean实体注入,关联到userService的引入上。

但是如果UserService这个接口存在多个实现类的时候,就会在spring注入的时候报错,具体如下:
public class UserService1 implements UserService
public class UserService2 implements UserService

当存多个UserService的实现类时,错误信息如下:
2016-08-05 14:53:53,795 ERROR [org.springframework.test.context.TestContextManager] - <Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@14a2f921] to prepare test instance [UserServiceTest@3c87521]>
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserServiceTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private yjc.demo.service.UserService UserServiceTest.userService; nested exception is he[yjc.demo.service.UserService] is defined: expected single matching bean but found 2: userService1,userService2

抛出了org.springframework.beans.factory.BeanCreationException,而原因是注入的时候发现有2个匹配的bean,但是不知道要注入哪一个:expected single matching bean but found 2: userService1,userService2

那么如何应对多个实现类的场景呢,看一下代码:


@Autowired
private UserService userService1;@Autowired
private UserService userService2;@Autowired
@Qualifier(value = "userService2")
private UserService userService3;@Test
public void test(){System.out.println(userService1.getClass().toString());System.out.println(userService2.getClass().toString());System.out.println(userService3.getClass().toString());
}

运行结果:
class yjc.demo.serviceImpl.UserService1
class yjc.demo.serviceImpl.UserService2
class yjc.demo.serviceImpl.UserService2

运行结果成功,说明了2种处理多个实现类的方法:
1.变量名用userService1,userService2,而不是userService。
通常情况下@Autowired是通过byType的方法注入的,可是在多个实现类的时候,byType的方式不再是唯一,而需要通过byName的方式来注入,而这个name默认就是根据变量名来的。

2.通过@Qualifier注解来指明使用哪一个实现类,实际上也是通过byName的方式实现。

由此看来,@Autowired注解到底使用byType还是byName,其实是存在一定策略的,也就是有优先级。优先用byType,而后是byName。

@Autowired一个接口有多个实现类相关推荐

  1. spring容器注入一个接口的两个实现类

    转载自:https://www.cnblogs.com/linjiaxin/p/5897749.html spring容器中能拥有两个同种类型的bean吗?我有两个dao类同时实现一个接口,这两个接口 ...

  2. .Net Core DI依赖注入:一个接口注入多个实现类

    方式一.默认就可以注入多个实现类 例如接口IShow,注入ShowA和ShowB两个实现类: services.AddTransient<IShow, ShowA>(); services ...

  3. 同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier

    如果一个接口有2个以上不同的实现类, 那么如何Autowire一个指定的实现 1:首先,UserService接口有两个实现类 UserService1和 UserService2 UserServi ...

  4. 解答为什么@Autowired使用在接口上而不是实现类上

    如果Spring配置了<context:component-scan base-package="com.*.service"></context:compone ...

  5. 在.NET Core中处理一个接口多个不同实现的依赖注入问题

    前言 近段时间在准备公司的技术分享,所以这段时间将大部分时间放在准备分享内容上去了.博客也就停了一下下. 在.NET Core中处理依赖注入问题时,往往是定义好了一个操作规范的接口,会有N多个基于不同 ...

  6. 实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定

    简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口. ...

  7. 一个类可以有一个接口,接口可以有一个Java类吗?

    In the very first step, we will see can a class have an interface in Java? 在第一步中,我们将看到类可以在Java中具有接口吗 ...

  8. 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。 (2)设计四个类分

    代码 /*第二题:利用接口做参数,写个计算器,能完成加减乘除运算.(1)定义一个接口Compute含有一个方法int computer(int n, int m).(2)设计四个类分别实现此接口,完成 ...

  9. Java 核心五个类(File、Outputstream、Inputstream、Reader、Writer)一个接口(Serializable)...

    java BIO(阻塞式IO)    java.io 核心五个类(File.Outputstream.Inputstream.Reader.Writer)一个接口(Serializable) 1.Fi ...

最新文章

  1. 著名开源项目,神秘Bug影响超20000个项目,原因竟是作者删库跑路?
  2. Smarty变量调节器的使用
  3. Learning to Rank简介
  4. VTK:PolyData之BooleanOperationPolyDataFilter
  5. windows phone 中反序列化json时出现的问题
  6. 均分纸牌(经典贪心)
  7. ssm架构 开源项目_如何为您的开源项目选择正确的品牌架构
  8. 终于搞懂了Python模块之间的相互引用问题
  9. mysql+影响的行数+获取_CI中获取读操作的结果集行数+获取写操作的影响行数
  10. [转帖]九句英语闯天下
  11. Google整体架构猜想
  12. BF2 战地风云2常见问题解答
  13. ASP.NET MVC 4 tutorial
  14. mic in和line in
  15. MTK USB OTG功能如何打开及实现
  16. Epubor Ultimate for mac(mac电子书转换软件)
  17. 今日头条的新闻推荐算法原理
  18. [C#]使用Process的StandardInput与StandardOutput写入读取控制台数据
  19. 【PyTorch】4 姓氏分类RNN实战(Simple RNN)——18 种起源语言的数千种姓氏分类
  20. win10计算机卸载了,怎么把win10电脑里的软件卸载干净

热门文章

  1. linux命令grep不区分大小写,Linux grep 命令大全
  2. 内存白菜,T410上8G了
  3. 购物返现将会是新的网购起点
  4. C++ Test单元测试工具
  5. DDD 与 EDA- 核心逻辑提炼方法论
  6. android 复杂的列表视图新写法MultiType
  7. 基于LPWAN技术的低成本 IoT 物联网企业资产管理解决方案
  8. GRE核心词汇助记与精练-List7 坐、站、躺
  9. gitblit搭建本地服务器
  10. 「佛山市政」携手企企通,共同打造采购与供应链数字化管理平台