博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在spring中常被忽视的注解 @Primary
阅读量:5319 次
发布时间:2019-06-14

本文共 1657 字,大约阅读时间需要 5 分钟。

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

有如下一个接口

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

有下面的两个实现类:

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

 

//注意,这里没有注解public class OperaSinger implements Singer {    @Override    public String sing(String lyrics) {        return "I am singing in Bocelli voice: "+lyrics;    }}

 

下面就是注入上面的接口实现类:

@Componentpublic class SingerService {    private static final Logger logger = LoggerFactory.getLogger(SingerService.class);    @Autowired    private 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@Componentpublic class OperaSinger implements Singer{    @Override    public String sing(String lyrics) {        return "I am singing in Bocelli voice: "+lyrics;    }}

 

如果代码改成这样,再次运行,结果如下:

"I am singing in Bocelli voice: song lyrics", 用@Primary 告诉spring 在犹豫的时候优先选择哪一个具体的实现。
思考:貌似还有另外一种方法:利用qualifier names,应该会更好。

转载于:https://www.cnblogs.com/myhappylife/p/5647098.html

你可能感兴趣的文章
C#中StreamWriter与BinaryWriter的区别兼谈编码。
查看>>
树梅派基础
查看>>
SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming
查看>>
08: mysql主从原理
查看>>
hibernate分页查询的实现
查看>>
内存加载DLL
查看>>
BFC的布局规则以及触发条件
查看>>
八大排序算法
查看>>
highly variable gene | 高变异基因的选择 | feature selection | 特征选择
查看>>
事件响应模型(游戏引擎、JAVA中等应用)
查看>>
ARM学习笔记14——C语言和汇编相互套用
查看>>
学习笔记1126 - Fib的计算方法,降低了时间复杂度
查看>>
3-8 & 3-9Unicode 编码
查看>>
2016Unite Shanghai 总结
查看>>
zhlan--Python中的字典遍历方法 & 字典取值
查看>>
【iHMI43 4.3寸液晶模块】demo例程(版本1.02)发布
查看>>
【资料下载区】【iCore、 iCore2相关资料】更新日期2017/1/11
查看>>
ResNet,DenseNet
查看>>
我想学前端动画-CSS之transition
查看>>
WiFi攻击的三种方式
查看>>