作用
可以在依赖注入查找候选者的过程中对候选者进行过滤,比如:在需要自动注入java bean时,如果注入的是一个接口,而这个接口又有多个实现类,则会报错,解决方法是在注入接口上增加@Qualifier(“别名”) 和@Autowired注解。
使用范围:字段、方法、参数、任意类型、注解
参数:value
定义
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
String value() default "";
}
使用
1、用于类上
用在类上,你可以理解为给通过@Qulifier给这个bean打一个标签
public interface IService { }
@Component
@Qualifier("tag1") //@1
public class Service1 implements IService{ }
@1: 设置@Qulifier的value为tag1
@Component
@Qualifier("tag2") //@2
public class Service2 implements IService { }
@2: 设置@Qulifier的value为tag2
@Component
@Qualifier("tag3") //@3
public class Service3 implements IService { }
@3: 设置@Qulifier的value为tag3
@Component
public class InjectService {
@Autowired
@Qualifier("tag1") //@1
private Map<String, IService> serviceMap1;
@Autowired
@Qualifier("tag2") //@2
private Map<String, IService> serviceMap2;
@Autowired
@Qualifier("tag3") //@3
private Map<String, IService> serviceMap3;
}
@1: 限定符的值为tag1,此时会将类上限定符为tag1的所有bean注入进来
@2: 限定符的值为tag2,此时会将类上限定符为tag2的所有bean注入进来
@3: 限定符的值为tag3,此时会将类上限定符为tag3的所有bean注入进来
2、结合@Autowired使用
我们先定义一个接口,以及两个实现类,分别是Servicr1和Service2
public interface IService { }
@Component
@Qualifier("service1")
public class Service1 implements IService{ }
@Component
@Qualifier("service2")
public class Service2 implements IService { }
@Component
public class InjectService {
@Autowired
@Qualifier("service2") //@1
private IService service;
}
@1: 这里限定符的值为service2,容器中IService类型的bean有2个【service1,service2】,当类上没有标注@Qualifier注解的时候,可以理解为:bean的名称就是限定符的值,所以@1这里会匹配到service2
3、用于方法参数
public interface IService { }
@Component
@Qualifier("service1")
public class Service1 implements IService{ }
@Component
@Qualifier("service2")
public class Service2 implements IService { }
@Component
public class InjectService {
private IService s1;
private IService s2;
@Autowired
public void injectBean(@Qualifier("service2") IService s1, @Qualifier("service1") IService s2) { //@1
this.s1 = s1;
this.s2 = s2;
}
}
@1: 方法上标注了@Autowired注解,说明会被注入依赖,2个参数上分别使用了限定符来指定具体需要注入哪个bean
4、用在setter方法上
不管是用在setter方法还是普通方法上面,都是一样的效果
public interface IService { }
@Component
@Qualifier("service1")
public class Service1 implements IService{ }
@Component
@Qualifier("service2")
public class Service2 implements IService { }
@Component
public class InjectService {
private IService s1;
private IService s2;
@Autowired
@Qualifier("service2")
public void setS1(IService s1) {
this.s1 = s1;
}
@Autowired
@Qualifier("service1")
public void setS2(IService s2) {
this.s2 = s2;
}
}
上面2个setter方法上都有@Autowired注解,并且结合了@Qulifier注解来限定需要注入哪个bean
原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/268