咱们看到这几篇内容都是掌握基础,避免后续咱们作项目时回头从新复习,因此本节咱们来讨论下注解@Autowired和@Qualifier的区别所在。spring
首先咱们定义以下一个车辆接口,咱们知道车辆能够启动和中止,因此在此接口中咱们定义这两个方法,以下:springboot
package com.demo.springboot; public interface Vehicle { String start(); String stop(); }
接下来咱们定义汽车和自行车类来实现上述接口,以下:ide
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,可是此时咱们发现车辆接口是不明确的,咱们不知道此接口的具体实现究竟是汽车仍是自行车,因此编译器自动报错以下:this
这个时候注解@Qualifier就派上用场了,经过此单词解释也了然,意为限定:若是有多个相同类型的bean,则@Qualifier批注用于解决自动注解@Autowired冲突。 因此咱们须要经过注解@Qualifier来明确限定该接口的实例时汽车仍是自行车类,这里咱们限定为自行车类,以下:spa
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,因此咱们如上能够等同以下:code
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,以下:blog
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的旅行,感谢您的阅读,咱们下节见。编译器