同一接口有多个实现类,怎么来注入一个指定的实现?@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支持该注解的注入。


相关文章
|
网络协议 Linux 网络安全
Linux测试端口的连通性的四种方法
Linux测试端口的连通性的四种方法
1343 0
|
6月前
|
druid Java 应用服务中间件
五大主流数据库连接池的深度剖析与对比
HikariCP通过优化concurrentBag和fastStatementList等集合,提升了并发的读写效率。它采用threadlocal缓存连接,并大量运用CAS机制,以最大程度地减少lock的使用。从字节码的维度进行代码优化,确保方法尽量控制在35个字节码以内,以提升JVM处理效率。HikariCP在此基础上的进一步优化措施包括:利用ping命令进行mysql连接,以及通过Sharding-JDBC的Driver、Server和Sidecar三个版本,构建灵活多样的生态系统,满足不同需求和环境。对于线上应用,Sharding-JDBC-Driver可提供直连数据库的最优性能,而Sha
|
设计模式 Java 容器
在Java中调用一个接口的多个实现类
在Java中调用一个接口的多个实现类
1686 4
|
Java Spring 容器
spring的四种注入方式
spring的四种注入方式
675 0
|
Java 编译器 Spring
面试突击78:@Autowired 和 @Resource 有什么区别?
面试突击78:@Autowired 和 @Resource 有什么区别?
16740 6
|
SQL Java 数据库连接
成功解决:was not registered for synchronization because synchronization is not active
这篇文章是关于解决Mybatis在同步过程中出现"was not registered for synchronization because synchronization is not active"错误的技术博客。
成功解决:was not registered for synchronization because synchronization is not active
|
前端开发 关系型数据库 MySQL
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
|
Java Maven Spring
创建一个spring boot的3种方式
创建一个spring boot的3种方式
388 6
|
安全 Java 数据安全/隐私保护
【Spring底层原理高级进阶】【SpringCloud整合Spring Security OAuth2】深入了解 Spring Security OAuth2:底层解析+使用方法+实战
【Spring底层原理高级进阶】【SpringCloud整合Spring Security OAuth2】深入了解 Spring Security OAuth2:底层解析+使用方法+实战
|
开发框架 Java Spring
Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?
@Service注解,其实做了两件事情: @Autowired注解的意思就是: @Autowired和@Resource两个注解的区别: