前言
之前有用到过@qualifier不过都是直接拿来用了,没有研究他到底是干嘛的,今天又遇到了就研究一下他究竟是干嘛的,跟他相关的注解还有哪些。
@Qualifier
这个注解一般是跟@Autowired
搭配使用的,@Autowired
这个注解是用来标识需要注入的bean
,默认情况下,@Autowired
按类型装配 Spring Bean
。
但是如果有两个同名的bean该怎么办,仅使用这个注解不能正确定位该注入哪个bean
,这个时候就需要一个辅助来配合一下,就是@Qualifier
注解。
简单来说这个注解就是告诉spring我想注入哪个bean。
举个例子说明一下
定义一个基础接口
DemoBase
public interface DemoBase {
String test();
}
写一个实现类
Demo_A
@Component
public class Demo_A implements DemoBase{
public String test(){
return "testA";
}
}
再写一个实现类 Demo_B
@Component
public class Demo_B implements DemoBase{
public String test(){
return "testB";
}
}
最后写一个主方法
DemoMainAB
public class DemoMainAB {
@Autowired
private DemoBase demoBase;
//此处省略一万次
}
如果尝试将DemoMainAB
加载到上下文中,Spring
框架将抛出 NoUniqueBeanDefinitionException
这是因为Spring
不知道要注入哪个 bean,所以需要用@Qualifier
打个辅助,用来指定需要注入哪个bean
改造后的DemoMainAB
public class DemoMainAB {
@Autowired
@Qualifier("demoA")
private DemoBase demoBase;
//此处省略一万次
}
@Primary注解
先看个例子,以下代码也可以实现上面改造后的效果
@Component
@Primary
public class Demo_A implements DemoBase{
public String test(){
return "testA";
}
}
在Demo_A
中添加该注解作用是告诉spring容器我这个接口默认使用这个bean作为实现类依赖注入。
值得注意的是,如果 @Qualifier
和 @Primary
注释同时存在,那么 @Qualifier
注释的优先级更高。@Primary
是定义了默认值,而 @Qualifier 则是非常具体的。