最新实战案例锦集:《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对象。
public class A implements DAO {
}
public class B implements DAO {
}
接下来,我们在其它的类中进行注入,类型为DAO。
public class C {
private DAO dao ;
}
当启动Spring容器后,将抛出如下错误:
期望一个,但是发现两个a,b。
遇到这种情况,我们可以通过@Qualifier 注解指定需要注入的类型即可,如下示例:
private DAO dao ;
明确指定,我要注入的beanName为"a"。
以上,我们简单的介绍了下有关@Qualifier 在日常开发中的使用。接下来,我们将通过如下几方面进行更加高级的应用。
默认行为不指定beanName
@Qualifer在不设置value属性时,它将如何进行选择?
自定义注解依赖@Qualifier
通过自定义注解,但是自定义注解上还是依赖于@Qualifier来限定注入的beanName。
完全自定义注解不依赖@Qualifier
手动获取指定有限定符的所有Bean
我们不将依赖Spring的任何东西,而使用我们自定义的注解来限制注入的Bean。
2. 实战案例
2.1 @Qualifier不指定beanName
我们还是以上面的示例进行讲解,当我们在注入的字段上添加@Qualifier注解,但是不指定beanName时,会发生什么?
private DAO dao ;
启动容器后,抛出如下错误
该错误说明,容器中没有找到DAO类型的Bean,但是呢发现了2个用户定义的Bean但又无法注入(也就是A,B)。
为什么会这样呢?Spring会按照如下的流程做检查: