美文网首页
Spring学习笔记(六) Qualifier注解

Spring学习笔记(六) Qualifier注解

作者: 云师兄 | 来源:发表于2019-12-23 14:15 被阅读0次

    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注解

          本文链接:https://www.haomeiwen.com/subject/jamznctx.html