@Qualifier高级技巧,你会几个?深入底层原理

文摘   2024-11-11 19:00   新疆  

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:SpringBoot3.2.5



1. 简介

@Qualifier是Spring框架中的一个重要注解,主要用于解决依赖注入时的歧义性问题。当一个接口存在多个实现类,或者Spring容器中存在多个相同类型的Bean时,使用@Autowired注解进行自动注入会导致无法确定注入哪一个Bean。此时,可以通过@Qualifier注解来指定需要注入的Bean的名称,从而消除歧义。

@Qualifier注解通常与@Autowired / @Resource注解一起使用,标注在成员变量、方法入参或构造函数入参上。通过指定Bean的名称,@Qualifier注解能够确保Spring容器在自动注入时选择正确的Bean,从而避免NoUniqueBeanDefinitionException等异常的发生。如下示例:

我们在容器中定义了2个DAO类型的Bean对象。

@Componentpublic class A implements DAO {}@Componentpublic class B implements DAO {}

接下来,我们在其它的类中进行注入,类型为DAO。

@Componentpublic class C {
  @Resource private DAO dao ;}

当启动Spring容器后,将抛出如下错误:

期望一个,但是发现两个a,b。

遇到这种情况,我们可以通过@Qualifier 注解指定需要注入的类型即可,如下示例:

@Resource@Qualifier("a")private DAO dao ;

明确指定,我要注入的beanName为"a"。

以上,我们简单的介绍了下有关@Qualifier 在日常开发中的使用。接下来,我们将通过如下几方面进行更加高级的应用。

  1. 默认行为不指定beanName

    @Qualifer在不设置value属性时,它将如何进行选择?

  2. 自定义注解依赖@Qualifier

    通过自定义注解,但是自定义注解上还是依赖于@Qualifier来限定注入的beanName。

  3. 完全自定义注解不依赖@Qualifier

  4. 手动获取指定有限定符的所有Bean

    我们不将依赖Spring的任何东西,而使用我们自定义的注解来限制注入的Bean。

     

2. 实战案例

2.1 @Qualifier不指定beanName

我们还是以上面的示例进行讲解,当我们在注入的字段上添加@Qualifier注解,但是不指定beanName时,会发生什么?

@Resource@Qualifierprivate DAO dao ;

启动容器后,抛出如下错误

该错误说明,容器中没有找到DAO类型的Bean,但是呢发现了2个用户定义的Bean但又无法注入(也就是A,B)。

为什么会这样呢?Spring会按照如下的流程做检查:

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章