当一个接口,有多个实现类且均已注入到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. php mongdb driver 1.17

    Installation To build and install the driver: $ pecl install mongodb $ echo "extension=mongodb. ...

  2. docker aufs存储驱动文件系统

    Docker aufs存储驱动layer.diff.mnt目录的区别 /var/lib/docker/aufs layer子目录: 镜像.镜像历史列表.容器.容器INIT分别有对应的文件.文件名和di ...

  3. Ubuntu Rabbitmq 安装与配置

    原文链接:http://blog.csdn.net/rickey17/article/details/72756766 添加源 新增公钥(不加会有警告) 更新源 安装rabbitmq-server e ...

  4. 前x个数据中至少有m个元素最小值与最大值之差不超过K

    题意 给一组数据,从左到右开始,寻找最小的x,使得第1个元素到第x个元素中,至少存在m个数据,最小值与最大值之差不超过K. INPUT 第一行是T,代表数据组数 每组数据的第一行是三个整数,n.m.k ...

  5. linux克隆多台虚拟机后网络无法识别更无法连接上网的解决方法

    本人近期学习LINUX,想克隆多台CENTOS来练习在LINUX下安装软件,配置环境.因为对系统不是很熟悉,就想保持一个纯净版本,如果系统玩坏了就删除再重新克隆一个继续配置,以节省时间.后来发现,克隆 ...

  6. Shell编程WEB界面展示实践

    操作系统:win7 虚拟机:Virtual box with Ubuntu13.10 WEB服务器: Nginx WEB服务器发布目录:/usr/local/nginx/html/c 测试文件:lis ...

  7. 使用13行Python代码实现四则运算计算器函数

    原创的刷新行数记录的代码!!! 支持带小括号,支持多个连续+-号,如-7.9/(-1.2-++--99.3/-4.44)*---(2998.654+-+-+-(+1.3-7.654/(-1.36-99 ...

  8. Session服务器之Session复制!

    全部运行在Tomcat下 第一台主机:192.168.200.131  安装nginx 修改hosts文件 [root@localhost ~]# vim /etc/hosts 192.168.200 ...

  9. FFplay 命令

    1. 查看支持的格式: ffplay.exe -formats 2. 播放PCM裸流: ffplay.exe - -channels -f s16le -i pcm_file_path 根据PCM文件 ...

  10. leetcode菜鸡斗智斗勇系列(7)--- 用最小的时间访问所有的节点

    1.原题: https://leetcode.com/problems/minimum-time-visiting-all-points/ On a plane there are n points ...