1. 引子
我们知道,@Autowired是按照类型进行匹配,如果当前@Autowired标注的依赖在容器中只能找到一个实例与之对应的话,那还好。可是,要是能够同时找到两个或者多个同一类型的对象实例,又该怎么办呢? 我们自己当然知道应该把具体哪个实例注入给当前对象,可是,IoC容器并不知道,所以,得通过某种方式告诉它。这时,就可以使用@Qualifier对依赖注入的条件做进一步限定,使得容器不再迷茫。
@Qualifier实际上是byName自动绑定的注解版,既然IoC容器无法自己从多个同一类型的实例中 选取我们真正想要的那个,那么我们不妨就使用@Qualifier直接点名要哪个好了。
2. 示例
首先定义一个Car接口:
public interface Car {
public String print();
}
然后基于这个接口定义两个实现类:
@Component
public class Audi implements Car {
@Override
public String print(){
return "audi";
}
}
@Component
public class Benz implements Car {
@Override
public String print(){
return "benz";
}
}
写好之后,注入这个car:
@RestController
public class TestController {
@Autowired
private Car car;
...
}
刚注入car后,还没调用,这时IDEA就报错了,提示:
Could not autowire. There is more than one bean of 'Car' type.
正是因为有两个实现类,不知道注入哪个了,为此下面再添加一个注解:
@RestController
public class TestController {
@Autowired
@Qualifier("audi")
private Car car;
@GetMapping("/test")
public void testNacos(){
String carName = car.print();
System.out.println(carName);
}
}
结果输出为audi,说明是选择注入了。
此外,如果是构造注入或是方法注入的时候,该注解定义在变量上,示例如下:
@Autowired
public void setCar(@Qualifier("audi") Car car){
this.car = car;
}