spring @Primary-在spring中的使用

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

有如下一个接口

public interface Singer {String sing(String lyrics);
}

有下面的两个实现类:

@Component // 加注解,让spring识别
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}

//注意,这里没有注解

public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}

下面就是注入上面的

@Componentpublic class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;public String sing(){return singer.sing("song lyrics");}}

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;}
}

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

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

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

@Component("metalSinger") // 加注解,让spring识别
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}@Component("opreaSinger")
public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
@Component
public class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowired@Qualifier("opreaSinger")private Singer singer;public String sing(){return singer.sing("song lyrics");}
}

扩展:Spring注解常用汇总

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

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

<context:component-scan base-package=“cn.test”/>
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

@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”) 存在多个实例配合使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php获取手机的mac地址,Android手机获取Mac地址的方法

[导读]这篇文章主要为大家详细介绍了Android手机获取Mac地址的方法&#xff0c;具有一定的参考价值最常用的方法,通过WiFiManager获取&#xff1a;/*** 通过WiFiManager获取mac地址* param context* return*/private static String tryGetWifiMac(Context context) {WifiManage…

python使用蓝牙功能_python bluetooth蓝牙信息获取蓝牙设备类型的方法

python 获取蓝牙设备类型 扫描蓝牙设备获取到的信息中&#xff0c;无法判断扫描到的蓝牙设备属于什么类型的设备。 扫描蓝牙信息使用的是python 里面的bluetooth模块。 首先扫描出来的是这样的信息 (74:60:FA:FD:FC:49,HUAWEI P30,5898764) 可根据5898764来判断是什么蓝牙设备。…

MySQL建表字段长度的限制、汉字和字母占字节数

varchar(N)&#xff0c;N指的是最大字符数&#xff0c;不是字节数。 记住&#xff1a; &#xff08;1&#xff09;MySQL要求一个行的定义长度不能超过65535。 &#xff08;2&#xff09;单个字段如果大于65535&#xff0c;则转换为TEXT 。 &#xff08;3&#xff09;单行最…

linux 服务器启用端口,linux服务器放行端口

一、默认使用iptables的系统(例如centos6)1、关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放。下面是命令实现&#xff1a;iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT DROP再用命令iptables -L -n查看 是否设置好&#xff0c; 好看到全部 DROP 了这…

python3 xpath_Python 3中用XPath解析XML

我有以下xml&#xff1a;Biscuits Wrapped Finished Biscuits Biscuits (Wrapped)Biscuits Sweet Finished Biscuits Biscuits (Sweets)Biscuits Savoury Finished Biscuits Biscuits For Cheese....我已使用以下代码将其加载到树中&#xff1a;try: groups etree.parse(PRODU…

MySQL 无符号和有符号的区别

随笔记录: mysql无符号和有符号的区别 无符号unsigned 表示设置的的数据为0或者正数&#xff1b; 有符号则可以是负数 -&#xff1b; 内存占比 有符号 0-255 无符号 -127~127

linux下tomcat启动后无进程,Linux中Tomcat shutdown.sh后进程仍然存在解决办法

最近我们在使用Jenkins自动化部署项目时&#xff0c;在生产liunx环境下&#xff0c;使用脚本shutdown.sh停止tomcat服务&#xff0c;然后再start之后发现应用无法访问了&#xff0c;后台查看tomcat进程是发现有个2个tomcat进程&#xff0c;说明之前的shutdown并没有完全停掉tom…

扫地机器人电路原理图_扫地机有这一台就够了:石头扫地机器人T6 首拆

听说集齐13台扫地机器人可以召唤扫地机神兽&#xff0c;所以集齐了22台扫地机后我的神兽呢&#xff1f;自从上个月入手了石头科技出品的小瓦青春版扫地机之后已经集齐了所有小米(石头)系扫地机。小瓦青春版是一款无序清洁的扫地机产品&#xff0c;也是石头科技价格最低的入门级…

让我放弃FastDFS拥抱MinIO的8个瞬间

目前可用于文件存储的网络服务选择有很多&#xff0c;比如阿里云OSS、七牛云、腾讯云等等&#xff0c;但是收费都有点小贵。为了帮公司节约成本&#xff0c;之前一直是使用fastDFS作为文件服务器&#xff0c;准确的说是图片服务器。直到我发现了MinIO&#xff0c;我决定放弃Fas…

linux内核+红黑树删除,关于linux:Linux内核红黑树原理概括

二叉查找树因为在频繁的动静更新过程中&#xff0c;可能会呈现树的高度远大于 log2n的状况&#xff0c;所以就会导致各个操作效率降落&#xff0c;最坏的状况下就会进化为链表&#xff0c;变为O(n)&#xff0e;很显著&#xff0c;想要解决这个问题&#xff0c;无效的一种方法就…

http 和 https_Golang设置https访问,以及http如何重定向到https

设置https访问&#xff1a;初始代码为http监听&#xff1a;func main() { server : &http.Server{ Addr: ":8080", ... } go func() { if err : server.ListenAndServe(); err ! nil && err ! http.ErrServerClosed { log.Fa…

盘点分布式文件存储系统____分布式文件存储系统简介

盘点分布式文件存储系统 在项目的数据存储中&#xff0c;结构化数据通常采用关系型数据库&#xff0c;非结构化数据&#xff08;文件&#xff09;的存储就有很多种方式&#xff0c;服务器本地存储、Nas挂载、ftp等等&#xff0c;今天就来盘点一下&#xff0c;分布式文件存储系统…

linux 64 32 编译支持,在64位linux上编译32位程序 for i386 intel

编辑中# ld -VGNU ld version 2.15.92.0.2 20040927Supported emulations:elf_x86_64elf_i386i386linux#ld -m elf_i386Along with the -m32 flag in gcc, you may need to include the -melf_i386 flag for ld to properly link the 32bit objectfiles to the 32bit libraries…

linux ortp 编译,Linux下oSIP的编译使用应该是很简单的,其Install说明文档.doc

Linux下oSIP的编译使用应该是很简单的,其Install说明文档.docLinux下oSIP的编译使用应该是很简单的&#xff0c;其Install说明文档里也介绍的比较清楚&#xff0c;本文主要就oSIP在Windows平台下VC 6.0开发环境下的使用作出描述。  虽然oSIP的开发人员也说明了&#xff0c;oS…

常见分布式文件存储介绍、选型比较、架构设计

数据正成为世界上最有价值的资源&#xff0c;分布式文件存储是应对数据爆炸的最好解决方案&#xff0c;那就会涉及到分布式文件存储方案、选型、架构设计等。 分布式文件存储的来源 在这个数据爆炸的时代&#xff0c;产生的数据量不断地在攀升&#xff0c;从GB,TB,PB,ZB.挖掘…

python中id函数的用法_用id函数做几个测试

Python内置的id函数其实非常简单&#xff0c;就是将参数对象的内存地址返回&#xff0c;即id函数返回的是一个很大的整数&#xff08;地址&#xff09;。基于Python语言的特性&#xff0c;本文做了几个测试&#xff0c;还比较有趣。 相同整数的id相同 >>> a 6 >&g…

分布式文件系统对比与选型参考

一、分布式文件系统 分布式文件系统&#xff08;Distributed File System&#xff09;是指文件系统管理的物理存储资源不一定直接连接在本地节点上&#xff0c;而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户…

为什么python工程师掌握这些就够了_Python工程师薪资飙升,Python这些技能你掌握了吗...

Python的火热&#xff0c;也带动了工程师们的就业热。那么&#xff0c;Python的市场需求和工程师待遇到底如何呢&#xff1f;今天我们来看看具体数据。2019年招聘python工程师薪资飙升&#xff0c;Python这些技能你掌握了吗?Python岗位和待遇和要求怎么样&#xff1f;下面从招…

linux安装ld编译器,科学网—手动安装特定版本的gcc编译器 - 亓欣波的博文

Linux发行版中一般预装了gcc编译器&#xff0c;版本随系统不同而不同&#xff0c;有时候不想用(或者是不能用)系统默认的gcc编译器&#xff0c;就需要自己编译特定版本的gcc编译器。这里以在Ubuntu14.04环境(默认gcc为4.8.2)安装gcc4.6.3为例&#xff0c;记录一下安装过程。整个…