如果一个接口有2个以上不同的实现类, 那么如何Autowire一个指定的实现

1:首先,UserService接口有两个实现类 UserService1 UserService2

UserService接口

2:以下是UserService接口的两个实现类UserService1和UserService2,请注意@service注解的使用方式,这里给每个实现类标注了不同的名称,方便在@Resource注入时区别注入

UserService接口实现类UserService1

UserService接口实现类UserService2

比如一个接口有两个实现类,这时候再按@Autowired的方式去引用, 在同时存在两个实现类的情况下会报错, 这是由于 @Autowired 的特性决定的: @Autowired 的注入方式是 byType 注入, 当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的,所以会报错。

那么在同一类型拥有多个实现类的时候,如何注入呢?这种场景下,只能通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier 注解。

@Resource 默认是按照 byName 的方式注入的, 如果通过 byName 的方式匹配不到,再按 byType 的方式去匹配。

下面是几种注入方式

1. 通过 @Autowired 和 @Qualifier 配合注入

2:使用@Resource注入,根据@Service指定的名称区分

(flag1是UserService1实现类 @Service("flag1")注解指定的)

3. 使用@Resource注入,根据默认类名区分

userService1是UserService1实现类的类名

总结:
1、@Autowired 是通过 byType 的方式去注入的, 使用该注解,要求接口只能有一个实现类。
2、@Resource 可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。
3、@Qualifier 注解配合@Autowired 一起使用。

4、@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

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

  1. Java代码示例: 使用reflections工具类获取某接口下所有的实现类

    pom依赖 <dependency><groupId>org.reflections</groupId><artifactId>reflections& ...

  2. [MyBatis]DAO层只写接口,不用写实现类

    团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...

  3. 抽象类和接口设计_如何设计类和接口

    抽象类和接口设计 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...

  4. TypeScript中怎么用接口(interface)描述类(静态部分与实例部分)

    TypeScript是JavaScript的超集 在看TypeScript官方文档的接口一节的时候对于类的静态部分与实例部分产生了疑问,通过努力得到自认为相对合理的解释,写下此文以记所得,如有谬误感谢 ...

  5. JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)

    第3节 面向对象高级 一.继承 1.1 概述和使用 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法 ...

  6. java 接口与包_java常用类包接口

    类 String Integer Long File Date Thread (java.lang.Thread Thread类的定义:public class Thread extends Obje ...

  7. java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法

    什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equals),不算是函数式接口的方法. 被@FunctionalInterf ...

  8. java实体类实现抽象类_java接口、抽象类、实体类关系介绍

    接口:接口是一个引用类型,与类相似,不过在接口中只能包含常量,方法名和嵌套类型.没有构造器,所以不能被实例化只能被类所实现或者被另外的接口所继承.在接口中声明的方法没有方法体. 抽象类:将类层次中共有 ...

  9. Mybatis DAO接口为什么不需要实现类

    2019独角兽企业重金招聘Python工程师标准>>> Java动态代理 代理模式在GoF设计模式尤为突出,Spring AOP 就是代理模式的一个例子,而且它使用的也是JDK的动态 ...

最新文章

  1. 「2018山东一轮集训」 Tree
  2. kotlin集合操作符——过滤操作符
  3. struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)
  4. 图论--最短路--SPFA模板(能过题,真没错的模板)
  5. Hibernate操作数据库步骤(包括语法)
  6. flutter图标按钮_Flutter 中的常见的按钮组件 以及自 定义按钮组件
  7. LoadRunner安装
  8. 如何从业务和平台两方面入手,设计更具可靠性的微服务?
  9. 前期交互流程(PTES的第一步)
  10. 冰点还原离线激活_冰点还原精灵密钥,小编教你如何激活冰点还原精灵
  11. 超级玛丽java版下载jar文件_java超级玛丽混搭版jar
  12. 基于MIPS指令集的单周期处理器设计
  13. 母亲节与父亲节之我见
  14. 网站pv和uv比例多少合适
  15. AR红包Android端实现原理
  16. K8S taint(污点)和tolerations(污点容忍)
  17. Covert Communication in Mobile Applications 手机应用中的隐秘通信
  18. 解决click在ios反应慢的问题
  19. VIO--后端优化实践(坑)
  20. 性能优化之Redis优化

热门文章

  1. mybatis学习教程中级(十)mybatis和ehcache缓存框架整合(重点)
  2. 《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记
  3. 浅谈mysql的子查询
  4. 谈谈即时通讯开发平台
  5. flash 绘图API:绘制弧线
  6. ANSYS——固定斜度的变截面变截面的定义、自由耦合和变截面的定义
  7. js 数组移除_2020前端面试--常见的js面试题
  8. 怎样在excel表格中画斜线并打字_一日一技丨Excel斜线表头如何制作?标题、表头的4个技巧...
  9. 手机运行服务器无响应,《最强蜗牛》服务器无响应怎么办 服务器无响应解决方法...
  10. 第5章 Python 数字图像处理(DIP) - 图像复原与重建1 - 高斯噪声