@Autowired一个接口有多个实现类
@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一个接口有多个实现类相关推荐
- spring容器注入一个接口的两个实现类
转载自:https://www.cnblogs.com/linjiaxin/p/5897749.html spring容器中能拥有两个同种类型的bean吗?我有两个dao类同时实现一个接口,这两个接口 ...
- .Net Core DI依赖注入:一个接口注入多个实现类
方式一.默认就可以注入多个实现类 例如接口IShow,注入ShowA和ShowB两个实现类: services.AddTransient<IShow, ShowA>(); services ...
- 同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
如果一个接口有2个以上不同的实现类, 那么如何Autowire一个指定的实现 1:首先,UserService接口有两个实现类 UserService1和 UserService2 UserServi ...
- 解答为什么@Autowired使用在接口上而不是实现类上
如果Spring配置了<context:component-scan base-package="com.*.service"></context:compone ...
- 在.NET Core中处理一个接口多个不同实现的依赖注入问题
前言 近段时间在准备公司的技术分享,所以这段时间将大部分时间放在准备分享内容上去了.博客也就停了一下下. 在.NET Core中处理依赖注入问题时,往往是定义好了一个操作规范的接口,会有N多个基于不同 ...
- 实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定
简介 一般来说,我们创建类和接口的时候都是一个类一个文件,一个接口一个文件,但有时候为了方便或者某些特殊的原因,java并不介意在一个文件中写多个类和多个接口,这就有了我们今天要讲的内部类和内部接口. ...
- 一个类可以有一个接口,接口可以有一个Java类吗?
In the very first step, we will see can a class have an interface in Java? 在第一步中,我们将看到类可以在Java中具有接口吗 ...
- 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。 (2)设计四个类分
代码 /*第二题:利用接口做参数,写个计算器,能完成加减乘除运算.(1)定义一个接口Compute含有一个方法int computer(int n, int m).(2)设计四个类分别实现此接口,完成 ...
- Java 核心五个类(File、Outputstream、Inputstream、Reader、Writer)一个接口(Serializable)...
java BIO(阻塞式IO) java.io 核心五个类(File.Outputstream.Inputstream.Reader.Writer)一个接口(Serializable) 1.Fi ...
最新文章
- 著名开源项目,神秘Bug影响超20000个项目,原因竟是作者删库跑路?
- Smarty变量调节器的使用
- Learning to Rank简介
- VTK:PolyData之BooleanOperationPolyDataFilter
- windows phone 中反序列化json时出现的问题
- 均分纸牌(经典贪心)
- ssm架构 开源项目_如何为您的开源项目选择正确的品牌架构
- 终于搞懂了Python模块之间的相互引用问题
- mysql+影响的行数+获取_CI中获取读操作的结果集行数+获取写操作的影响行数
- [转帖]九句英语闯天下
- Google整体架构猜想
- BF2 战地风云2常见问题解答
- ASP.NET MVC 4 tutorial
- mic in和line in
- MTK USB OTG功能如何打开及实现
- Epubor Ultimate for mac(mac电子书转换软件)
- 今日头条的新闻推荐算法原理
- [C#]使用Process的StandardInput与StandardOutput写入读取控制台数据
- 【PyTorch】4 姓氏分类RNN实战(Simple RNN)——18 种起源语言的数千种姓氏分类
- win10计算机卸载了,怎么把win10电脑里的软件卸载干净