何方妖孽@Qualifier

268 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

@Qualifier的作用

@Qualifier的作用就是@Autowired注解由于有多个符合条件的bean,从而无法确认注入哪个bean的时候,来创建一个标识,告诉我们应该使用哪个具体的bean的作用

创建自定义的限定器@Qualifier

摘要: 上一篇文章(spring的@Autowired报红了, - 掘金 (juejin.cn))

记述了通过String类型的标识符限定自动装配的Bean,这一次就再次深入了解限定器:

通俗来讲想要创建一个自定义的限定器注解,我们就先定义一个注解,然后使用@Qualifier注解作为它的老父亲(元注解)

,例如我们创建一个@SpringQualifierTest注解来充当限定器,如下:

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@RetenTion(RetentionPolicy.RUNTIME)
@Qualifier
public @interface SpringQualifierTest{
    
}

通过自定义的@SpringQualifierTest注解来代替之前标注在Guitar类上的@Qualifier注解

@SpringQualifierTest
public class Guitar implements Instrument{
    
}

同样也可以使用@SpringQualifierTest注解对自动装配的属性进行限定

@SpringQualifierTest
@Autowired
private Instrument instrument;

当spring尝试装配Instrument属性时,spring会把所有可选择的乐器Bean缩小到只有被@SpringQualifierTest注解所标注的Bean,如果只有一个乐器类使用了该注解,那这个bean就会直接被装配到instrument属性之中;

如果使用@SpringQualifierTest注解的乐器Bean有很多个,比如还有另一个乐器类也用到了该@SpringQualifierTest注解,那么这个时候我们就可以再次新建一个注解类,来让他具有唯一性,当要使用这个bean的时候,我们同时使用这两个注解就阔以了,直接上案例,通俗易懂:

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@RetenTion(RetentionPolicy.RUNTIME)
@Qualifier
public @interface SpringQualifierTest2{
    
}

然后在乐器的类上,再加一个这样的注解,就可以,例如:

@SpringQualifierTest
@Autowired
@SpringQualifierTest2
private Instrument instrument;

当进行注入bean的时候,我们就回去判断,谁同时拥有这两个注解,那么我们就给谁注入这个对应的Bean,

prefact,完美手工,这就是@Qualifier注解类的自定义内容了,