• SpringBoot系列之注解@Autowired VS @Qualifier VS @Primary(五)


    前言

    我们看到这几篇内容都是掌握基础,避免后续我们做项目时回头重新复习,所以本节我们来讨论下注解@Autowired和@Qualifier的区别所在。

    @Autowired VS @Qualifier VS @Primary

    首先我们定义如下一个车辆接口,我们知道车辆可以启动和停止,所以在此接口中我们定义这两个方法,如下:

    package com.demo.springboot;
    
    public interface Vehicle {
        String start();
        String stop();
    }

    接下来我们定义汽车和自行车类来实现上述接口,如下:

    package com.demo.springboot;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Bike implements Vehicle {
        @Override
        public String start() {
            return "Bike started";
        }
    
        @Override
        public String stop() {
            return "Bike stopped";
        }
    }
    package com.demo.springboot;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Car implements Vehicle {
        @Override
        public String start() {
            return  "Car started";
        }
    
        @Override
        public String stop() {
            return "Car stopped";
        }
    }

    接下来我们定义车辆服务类,并调用车辆接口,如下:

    package com.demo.springboot;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class VehicleService {
        
        @Autowired
        private Vehicle vehicle;
    
        public String start() {
            return vehicle.start();
        }
    
        public String stop() {
            return vehicle.stop();
        }
    }

    我们在通过汽车和自行车实现车辆接口,同时通过添加注解@Component来创建bean,接下来我们在创建车辆服务类时通过注解@Autowired来获取Spring IOC容器中的车辆bean,但是此时我们发现车辆接口是不明确的,我们不知道此接口的具体实现到底是汽车还是自行车,所以编译器自动报错如下:

    这个时候注解@Qualifier就派上用场了,通过此单词解释也了然,意为限定:如果有多个相同类型的bean,则@Qualifier批注用于解决自动注解@Autowired冲突。 所以我们需要通过注解@Qualifier来明确限定该接口的实例时汽车还是自行车类,这里我们限定为自行车类,如下:

    package com.demo.springboot;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    @Service
    public class VehicleService {
    
        @Autowired
        @Qualifier("bike")
        private Vehicle vehicle;
    
        public String start() {
            return vehicle.start();
        }
    
        public String stop() {
            return vehicle.stop();
        }
    }

    注解@Autowired既可以作用于字段,也可以作用于构造函数,使用注解@Autowired作用于构造函数时,在Spring 4.3版本后(如果我没记错的话)可以省略注解@Autowired,所以我们如上可以等同如下:

    package com.demo.springboot;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    @Service
    public class VehicleService {
        
        private Vehicle vehicle;
    
        public VehicleService(@Qualifier("bike") Vehicle vehicle) {
            this.vehicle = vehicle;
        }
    
        public String start() {
            return vehicle.start();
        }
    
        public String stop() {
            return vehicle.stop();
        }
    }

    如上是我们在使用接口具体实例时使用注解@Qualifier限定,要是针对车辆接口的具体实现汽车和自行车类,我们有一个总是想注入的实现,也就是说在接口具体实现源头就指定而非调用时指定,此时我们应该怎么办呢?此时我们可以使用注解@Primary,如下:

    package com.demo.springboot;
    
    import org.springframework.context.annotation.Primary;
    import org.springframework.stereotype.Component;
    
    @Component
    @Primary
    public class Bike implements Vehicle {
        @Override
        public String start() {
            return "Bike started";
        }
    
        @Override
        public String stop() {
            return "Bike stopped";
        }
    }
    package com.demo.springboot;
    
    import org.springframework.stereotype.Service;
    
    @Service
    public class VehicleService {
    
        private Vehicle vehicle;
    
        public VehicleService(Vehicle vehicle) {
            this.vehicle = vehicle;
        }
    
        public String start() {
            return vehicle.start();
        }
    
        public String stop() {
            return vehicle.stop();
        }
    }

    想必通过如上简单的例子我们明白了如题三者的使用,我们同样来下一个结论:@Autowired注解使我们能够将依赖项注入bean,当可以按类型能够唯一地找到每个bean时,它无需附加配置就可以很好地工作,但是当我们可以注入多个bean时,我们必须使用注解@Qualifier按名称或注解@Primary指定主体来帮助Spring找到所需的具体实现。 

    总结

    本节简短的内容我们到此结束,关于一些基本注解的使用和区别到这里就已结束,后续遇到其他的继续通过博文补充,下一节我们将进入Web的旅行,感谢您的阅读,我们下节见。

  • 相关阅读:
    20155327 2017-2018-2 《Java程序设计》第9周学习总结
    20155327《Java程序设计》第八周学习总结
    实验二 Java面向对象程序设计
    20155327 李百乾 Exp4 恶意代码分析
    20155327结对编程练习
    20155327第七周学习总结
    2017-2018-1 20155310 20155337 实验五 通讯协议设计
    # 2017-2018-1 20155337《信息安全系统设计基础》第十三周学习总结
    # 20155337 2017-2018 1 课上测试、课下作业、实验
    # 课下测试ch02
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/12153891.html
Copyright © 2020-2023  润新知