当一个接口,有多个实现类且均已注入到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. 动态规划: 最大m子段和问题的详细解题思路(JAVA实现)

    这道最大m子段问题我是在课本<计算机算法分析与设计>上看到,课本也给出了相应的算法,也有解这题的算法的逻辑.但是,看完之后,我知道这样做可以解出正确答案,但是我如何能想到要这样做呢? 课本 ...

  2. Linux 笔记:文件名

    文件名 Linux 系统区分英文字符的大小写.比如,myfile, Myfile 和 myFILE表示的是三个不同的文件.同样,用户密码和登录名也需要区分大小写(这里沿用了Unix 和 C 语言的命名 ...

  3. 【代码总结】PHP面向对象之抽象类

    一.什么是抽象方法? 一个方法如果没有方法体(不使用"{}",直接使用分号结束的方法,才是没有方法体的方法),则这个方法就是抽象方法 1.声明一个方法,不使用{},而直接分号结束 ...

  4. [转]JDK1.0到12各版本新特性

    原文链接 JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢.JDK Version 1.1 1 ...

  5. 一类Log-Gamma积分的一般形式

    \[\Large\int_{0}^{z}x^{t}\ln\Gamma \left ( 1+x \right )\mathrm{d}x~,~z>0\, ,\, t\in N^{*}\] \(\La ...

  6. CRS-1硬件维护

    一.CRS-1硬件介绍CRS-1 路由器是Cisco 推出的新的大容量骨干路由器,是一个支持多机箱扩展的路由系统.其设计容量可以扩展至72 个线卡机箱.8 个矩阵机箱,总交换容量达到92Tbps,具有 ...

  7. js里常见的三种请求方式$.ajax、$.post、$.get分析

    $.post和$.get是$.ajax的一种特殊情况: $.post和$.get请求都是异步请求,回调函数里写return来返回值是无意义的, 回调函数里对外部变量进行赋值也是无意义的. 即使是$.a ...

  8. Linux 命令中 find 和 xargs 命令的用法

    find 命令(一) find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作.Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大. ...

  9. 深入JAVA注解-Annotation(学习过程)

    JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...

  10. 去重sort|uniq -d

    #!/bin/bash ############################################################### #Author :Bing # #Create ...