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

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

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

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

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支持该注解的注入。


相关文章
|
NoSQL 算法 Java
面试官:网关如何实现限流?
面试官:网关如何实现限流?
1748 2
面试官:网关如何实现限流?
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
4233 1
|
Java Spring
【注解】Spring AOP 面向切面编程之@Around的详细用法
【注解】Spring AOP 面向切面编程之@Around的详细用法
4145 0
|
测试技术 索引
Elasticsearch search after分页检索案例
Elasticsearch search after分页检索案例分享 The best elasticsearch highlevel java rest api-----bboss 1.准备工作 参考文档《高性能elasticsearch ORM开发库使用介绍》导入和配置es客户端 2.
6184 0
|
8月前
|
存储 弹性计算 分布式计算
2026年阿里云 ECS 本地盘解析:NVMe SSD 与 SATA HDD 特性及选型指南
在阿里云 ECS 实例的存储方案中,本地盘凭借 “物理机直连” 的特性,提供低延迟、高 IOPS 的存储体验,成为高性能与海量存储场景的重要选择。目前阿里云本地盘主要分为 NVMe SSD 与 SATA HDD 两类,二者在性能、适用场景、实例兼容性上差异显著,需结合业务需求精准匹配。本文从技术特性、性能参数、适配实例及场景选型四方面展开解析,为用户提供客观参考。
2026年阿里云 ECS 本地盘解析:NVMe SSD 与 SATA HDD 特性及选型指南
|
IDE Java 开发工具
说一说 SpringBoot 中 CommandLineRunner
我是小假 期待与你的下一次相遇 ~
626 42
说一说 SpringBoot 中 CommandLineRunner
|
11月前
|
Arthas 数据可视化 Java
深入理解JVM《火焰图:性能分析的终极可视化利器》
火焰图是Brendan Gregg发明的性能分析利器,将复杂调用栈可视化为“火焰”状图形,直观展示函数耗时与调用关系。通过宽度识别热点函数,结合async-profiler或Arthas工具生成,助力快速定位CPU、内存等性能瓶颈,提升优化效率。
|
Java 关系型数据库 数据库连接
mybatis中的useGeneratedKeys和keyProperty
在 MyBatis 中,`useGeneratedKeys` 和 `keyProperty` 是用于处理数据库自动生成主键的关键配置。通过这些配置,可以方便地获取和使用数据库生成的主键值,提高开发效率和代码可读性。确保正确配置和使用这两个属性,可以在应用程序中高效地进行数据库操作。
1110 25
|
设计模式 Java 容器
在Java中调用一个接口的多个实现类
在Java中调用一个接口的多个实现类
2106 4
|
Java 编译器 Spring
面试突击78:@Autowired 和 @Resource 有什么区别?
面试突击78:@Autowired 和 @Resource 有什么区别?
18286 7