Spring学习笔记(六) Qualifier注解

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;
}

你可能感兴趣的:(Spring学习笔记(六) Qualifier注解)