在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。下面是个简单的使用例子。

有如下一个接口

public interface Singer {String sing(String lyrics);
}
  • 1
  • 2
  • 3

有下面的两个实现类:

@Component // 加注解,让spring识别
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

//注意,这里没有注解

public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面就是注入上面的

@Componentpublic class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;public String sing(){return singer.sing("song lyrics");}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

I am singing with DIO voice: song lyrics. 原因很简单,就是 OperaSinger 这个类上面根本没有加上注解@Copmonent 或者 @Service, 所以spring 注入的时候,只能找到 MetalSinger 这个实现类. 所以才有这个结果。

但是如果一旦 OperaSinger 这个类加上了@Copmonent 或者 @Service 注解,有趣的事情就会发生,你会发现一个错误的结果或异常: 
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger

提示很明确了,spring 根据类型无法选择到底注入哪一个。这个时候@Primay 可以闪亮登场了。

@Primary
@Component
public class OperaSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果代码改成这样,再次运行,结果如下: 
“I am singing in Bocelli voice: song lyrics”, 用@Primary 告诉spring 在犹豫的时候优先选择哪一个具体的实现。

二、用@Qualifier这个注解来解决问题

将上面的两个类改为如下:

@Component // 加注解,让spring识别
@Qualifier("metalSinger")
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}@Component
@Qualifier("opreaSinger")
public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
@Component
public class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;@Qualifier("opreaSinger")public String sing(){return singer.sing("song lyrics");}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

扩展:Spring注解常用汇总

使用注解之前要开启自动扫描功能

其中base-package为需要扫描的包(含子包)

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。 
@Scope注解 作用域 
@Lazy(true) 表示延迟初始化 
@Service用于标注业务层组件、 
@Controller用于标注控制层组件(如struts中的action) 
@Repository用于标注数据访问组件,即DAO组件。 
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 
@Scope用于指定scope作用域的(用在类上) 
@PostConstruct用于指定初始化方法(用在方法上) 
@PreDestory用于指定销毁方法(用在方法上) 
@Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 
@DependsOn:定义Bean初始化及销毁时的顺序 
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用 
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

spring @Primary-在spring中的使用

2017年12月18日 15:08:05

阅读数:938

在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。下面是个简单的使用例子。

有如下一个接口

public interface Singer {String sing(String lyrics);
}
  • 1
  • 2
  • 3

有下面的两个实现类:

@Component // 加注解,让spring识别
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

//注意,这里没有注解

public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面就是注入上面的

@Componentpublic class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;public String sing(){return singer.sing("song lyrics");}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

I am singing with DIO voice: song lyrics. 原因很简单,就是 OperaSinger 这个类上面根本没有加上注解@Copmonent 或者 @Service, 所以spring 注入的时候,只能找到 MetalSinger 这个实现类. 所以才有这个结果。

但是如果一旦 OperaSinger 这个类加上了@Copmonent 或者 @Service 注解,有趣的事情就会发生,你会发现一个错误的结果或异常: 
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger

提示很明确了,spring 根据类型无法选择到底注入哪一个。这个时候@Primay 可以闪亮登场了。

@Primary
@Component
public class OperaSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果代码改成这样,再次运行,结果如下: 
“I am singing in Bocelli voice: song lyrics”, 用@Primary 告诉spring 在犹豫的时候优先选择哪一个具体的实现。

二、用@Qualifier这个注解来解决问题

将上面的两个类改为如下:

@Component // 加注解,让spring识别
@Qualifier("metalSinger")
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}@Component
@Qualifier("opreaSinger")
public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
@Component
public class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;@Qualifier("opreaSinger")public String sing(){return singer.sing("song lyrics");}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

扩展:Spring注解常用汇总

使用注解之前要开启自动扫描功能

其中base-package为需要扫描的包(含子包)

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。 
@Scope注解 作用域 
@Lazy(true) 表示延迟初始化 
@Service用于标注业务层组件、 
@Controller用于标注控制层组件(如struts中的action) 
@Repository用于标注数据访问组件,即DAO组件。 
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 
@Scope用于指定scope作用域的(用在类上) 
@PostConstruct用于指定初始化方法(用在方法上) 
@PreDestory用于指定销毁方法(用在方法上) 
@Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 
@DependsOn:定义Bean初始化及销毁时的顺序 
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用 
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

@Primary注解在spring中的使用相关推荐

  1. Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件

    首先来看看使用反射来获取注解名: 只需在获取class后调用getAnnotation方法即可,如下 这里是获取JPA映射b表名,Table.class,使用下面这个可以获取表名 import jav ...

  2. @PersistenceContext 注解在spring中代理

    @PersistenceContext private EntityManager em;springBoot 2.x 这里注入的是EntityManager的代理类,注入的代理类是单例的,所以是线程 ...

  3. 详细讲解Spring中的@Bean注解

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_42140261/ article/details/104864333 随着SpringBoot的流行,我们现在更 ...

  4. Spring 中的各种注解,光会用可不够哦!

    来源:https://digdeep.cnblogs.com/digdeep/p/4525567.html 1. Java中的注解 2. 使用 元注解 来自定义注解 和 处理自定义注解 3. spri ...

  5. 【Java基础】Spring 中 Bean 的理解与使用

    大白话讲解: 从广义上 Spring 注解可以分为两类: 一类注解是用于注册 Bean 假如 IoC 容器是一间空屋子,首先这间空屋子啥都没有,我们要吃大餐,我们就要从外部搬运食材和餐具进来.这里把某 ...

  6. spring中@Autowired用法

    @Autowired注解是Spring中非常重要且常见的,接下来就简要的介绍一下它的用法. @Autowired默认是通过set方法,按照类型自动装配JavaBean,set方法可省略不写,它主要是修 ...

  7. Spring中@Primary注解

    1.概述 讨论Spring的@Primary注解,该注解是框架在3.0版中引入的. 其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级. 2.为什么需要@Pri ...

  8. Spring框架中@Primary注解的作用

    @Primary注解 @Primary的作用就是当一个接口存在多个实现类时,我们就可以通过@Primary注解来指明哪个实现类作为首选进行自动装配注入. 如果不加@Primary注解,接口ICarSe ...

  9. 详解Spring中@Autowire,@Value 注解实现原理

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u013202238/article/details/107879726 本文主要基于SpringBoot-2.3.3.RELE ...

  10. Spring中Autowired注解到底怎么实现的

    前言 使用Spring开发时,进行配置主要有两种方式,一是XML的方式,二是Java Config的方式. Spring技术自身也在不断的发展和改变,从当前springboot的火热程度来看,java ...

最新文章

  1. 重磅!复旦邱锡鹏老师NLP实战code解读开源!
  2. 上帝的指纹——分形与混沌
  3. Visual C++ 2011-8-15
  4. 仿百度GIF验证码 GIFEncoder 跳动验证码 随机背景色、颜色、字体、子大小、偏移、干扰线等...
  5. 给演讲增色的10种简单方法
  6. Win32 API 枚举打印机
  7. python的sys.path
  8. springboot配置允许跨域访问
  9. C/C++插入数据到Mysql数据库中
  10. python 二维列表从小到大_给Python开发者准备的110道面试题
  11. 摊上事了?中国卖家对亚马逊发起集体诉讼:3000多账号被封 损失惨重
  12. 怎样将树的中序遍历的数输入到一个数组中_数据结构与算法-二叉查找树平衡(DSW)...
  13. exfat最佳单元大小_2020年Window系统重装最佳方式
  14. Pair Programming (结对编程)
  15. webform(八)组合查询
  16. php代码审计_代码审计|PHP反序列化初识
  17. IEC 62368认证测试项目
  18. centos7系统k8s部署gitlib-runner
  19. vmware虚拟机使用详解
  20. 服务器安全篇之一【网络安全】

热门文章

  1. markdown基础
  2. sql server2000挂起的解决方法
  3. php 错误503的原因,CentOS + Apache2.4 + PHP5.6 FPM报503错误
  4. Infor宣布首次公开募股
  5. linux设置搜狗输入法,Ubuntu系统安装和使用搜狗输入法
  6. Ubuntu 14.04 LTS 搜狗拼音输入法不能使用的情况
  7. JScript服务器运行,jscript模拟的“控制台”程序Web服务器教程
  8. 题目234 吃土豆
  9. 【Linux 内核】实时调度类 ④ ( 实时运行队列 rt_rq 源码分析 | 实时运行队列 rt_rq 结构体字段分析 | active、rt_nr_running、curr、next 字段 )
  10. Bootstrap之折叠(Collapse)