当一个接口,有多个实现类且均已注入到spring容器中了,使用时@AutoWired是byType的,而这些实现类类型都相同,此时就需要使用@Qualifier明确指定使用那个实现类。因此,@Qualifier是byName的。

1、基本

public interface Formatter {
String format();
} @Component("fooFormatter")
public class FooFormatter implements Formatter {
@Override
public String format() {
return "foo";
}
} @Component("barFormatter")
public class BarFormatter implements Formatter {
@Override
public String format() {
return "bar";
}
}

idea提示,必须添加@Qualifier,否则红线。

最后,形如:

@SpringBootTest
class QualifierTest {
@Qualifier("barFormatter")
@Autowired
private Formatter formatter;
@Test
void test() {
System.out.println(formatter.format());
}
}

执行,输出:bar

如果将barFormatter改成fooFormatter,输出:foo。

2、对于实现类,可不用在@Compoment后的括号里声明名称,可以新增@Qualifier指定名称,如:

@Component
@Qualifier("fooFormatter")
public class FooFormatter implements Formatter {
。。。
}
@Component
@Qualifier("barFormatter")
public class BarFormatter implements Formatter {
。。。
}

3、对于实现类,去掉名称,加上@Primary,也可以实现。意思是:默认使用@Primary的实现类,无需使用@Qualifier明确指定使用那个实现类了。

@Component
@Primary
public class FooFormatter implements Formatter {
...
}
@Component
public class BarFormatter implements Formatter {
...
}

但是,如果以上2个实现类都加上了@Primary,依赖时,就会报错:

如果,@Qualifier与@Primary同时使用呢?优先使用@Qualifier指明的实现类。如:

@Qualifier("barFormatter")
@Autowired
private Formatter formatter;

输出:bar。

@Primary一般在DataSource中用的较多,因为有druid实现、c3p0实现,而一般使用一个具体的连接池,因此为了偷懒,就采用@Primary了。

4、在多个实现类中,使用指定实现类的另外一种方法是,属性名称写全了。

@Component
public class FooFormatter implements Formatter {
。。。
}
@Component
public class BarFormatter implements Formatter {
。。。
} @SpringBootTest
class QualifierTest {
@Autowired
private Formatter barFormatter;
@Test
void test() {
System.out.println(barFormatter.format());
}
}

输出:bar

@Qualifier的更多相关文章

  1. @Resource、@Autowired、@Qualifier的注解注入及区别

    在Java代码中可以使用 @Resource  或者 @Autowired 注解方式来进行注入. 虽然 @Resource 和 @Autowried 都可以完成依赖注入,但是他们是有区别的. 一: @ ...

  2. passing argument 3 of ‘wtk_hlv_rec_init’ discards ‘const’ qualifier from pointer target type

    -Werror,编译出现如下错误: src/wtk/exam/wtk_ndx.c:154:6: error: passing argument 3 of ‘wtk_hlv_rec_init’ disc ...

  3. javax.inject中@Inject、@Named、@Qualifier和@Provider用法

    @Inject @Inject支持构造函数.方法和字段注解,也可能使用于静态实例成员.可注解成员可以是任意修饰符(private,package-private,protected,public).注 ...

  4. Spring的qualifier标签

    @Autowired是根据类型进行自动装配的.如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存 ...

  5. Spring @Resource、@Autowired、@Qualifier的区别

    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Resource注解是J2EE提供,而@Autowired是由Spring提供,故减少系统对s ...

  6. [IoC]6 详解@Autowired、@Qualifier和@Required

    A.@Autowired org.springframework.beans.factory.annotation.Autowired public @interface Autowired Mark ...

  7. 详解@Autowired、@Qualifier和@Required

    A.@Autowired org.springframework.beans.factory.annotation.Autowired public @interface Autowired Mark ...

  8. spring @qualifier注解

    1.spring @qualifier注解用来在spring按类型装配可能存在多个bean的情况下,@qualifier注解可以用来缩小范围或者指定唯一. 也可以用来指定方法参数 2.@qualifi ...

  9. Spring Autowiring @Qualifier example

    In Spring, @Qualifier means, which bean is qualify to autowired on a field. See following scenario : ...

  10. Spring注释@Qualifier

    在学习@Autowired的时候我们已经接触到了@Qualifier, 这节就来详细学习一下自定义@Qualifier. 例如定义一个交通工具类:Vehicle,以及它的子类Bus和Sedan. 如果 ...

随机推荐

  1. SpringCloud全家桶学习之一阶段总结(一)

    一.概述 前几篇小博客记录了我学习SpringCloud组件的过程,并与工作中所用的Dubbo框架做了一点比较,基本组件:Eureka.Ribbon.Hystrix.Feign.Zuul.Config ...

  2. 2.1.FastDFS-单机拆分版-调度器安装配置

    Centos610系列配置 我们在Centos610FastDFS单机模式-FastDFS安装 中已经完成了FastDFS的安装,接下来我们进行FastDFS调度器的安装. 1.找到FastDFS配置 ...

  3. 「JSOI2013」侦探jyy

    「JSOI2013」侦探jyy 传送门 个人感觉我写的复杂度不够优秀啊,但是好像没有别的办法了... 我们枚举每个点,考虑这个点能不能不发生. 首先我们从这个点开始,在反图上面 \(\text{BFS ...

  4. 【安全运维】Vim的基本操作

    i 插入模式 : 末行模式 a 光标后插入 A 切换行末 I 切换行首 o 换行 O 上一行 p 粘贴 u 撤销 yy 复制 4yy 复制四行 dd (剪切)删除一行 2dd (剪切)删除两行 D 剪 ...

  5. mysql 默认信息

    泰基MYSQL默认信息 登录名1-------默认用户 名字:root 密码:123 登录名2-------APP对应的数据库 名字:hotekey 密码:8888

  6. ANSYS 非线性材料模型简介1 ---常用弹塑性模型

    目录 1. 材料非线性 2. 三个准则 2.1 屈服准则 2.2 流动准则 2.3 强化准则 3. 常用弹塑性模型 3.1 双线性等向强化 3.2 多线性等向强化 3.3 非线性等向强化 3.4 双线 ...

  7. ipfs 资料汇集

    目录 js ipfs u can use wikipeida here js ipfs https://github.com/ipfs/js-ipfs u can use wikipeida here ...

  8. extractvalue报错注入

    查看源码 $uagent = $_SERVER['HTTP_USER_AGENT']; ………… $uname = check_input($_POST['uname']); $passwd = ch ...

  9. vue学习笔记:Hello Vue

    编写简单例子,了解下基本语法 <!DOCTYPE html> <html> <head> <meta charset="utf-8 "&g ...

  10. C语言的变量存储方式和生存期

    2020.2.28日,封城一个多月了,紧邻毕业期,我在家抽空学习一下C. 看到了变量的存储方式和生存期这一章节,下面就是我整理的内容 下面是用于理解静态局部变量这个概念所写的代码,主要是需要分析一下函 ...