Spring注解——同一接口有多个实现类,如何注入
先写一个场景,举例说明:
1、接口:IAnimal
public Interface IAnimal{......
}
2、实现类:DogImpl ,实现了IAnimal接口。
@Service("dogImpl")
public class DaoImpl impliments IAnimal{...
}
3、业务类:AnimalController
public class AnimalController {@Autowiredprivate IAnimal dogImpl;......
}
假如有一个“动物”的接口 IAnimal, DogImpl类实现了接口 IAnimal, 且该接口只有 DogImpl这一个实现类,那么在引用实现类的时候,我们使用的是实现类的接口(像上面程序展示的那样)。Spring会按 byType的方式寻找接口的实现类,将其注入。
假如有另一个实现类 CatImpl 也实现了接口 IAnimal, 这时候再按上面的方式去引用, 在同时存在两个实现类的情况下,会出现什么情况呢?
答:会报错。 这是由于 @Autowired 的特性决定的: @Autowired 的注入方式是 byType 注入, 当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的,所以会报错。
那么在同一类型拥有多个实现类的时候,如何注入呢?
答:这种场景下,只能通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier 注解。
@Resource 默认是按照 byName 的方式注入的, 如果通过 byName 的方式匹配不到,再按 byType 的方式去匹配。所以上面的引用可以替换为:
public class AnimalController {@Resource(name="dogImpl") //实现类1中 @Service注解中标定的名称private IAnimal dogImpl;......
}
@Qualifier 注解也是 byName的方式,但是与@Resource 有区别,@Qualifier 使用的是 类名。
public class AnimalController {@Qualifier("DaoImpl") //实现类1的类名。注意区分与@Resource(name="dogImpl") 的区别。private IAnimal dogImpl;......
}
总结:
1、@Autowired 是通过 byType 的方式去注入的, 使用该注解,要求接口只能有一个实现类。
2、@Resource 可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。
3、@Qualifier 注解可以按名称注入, 但是注意是 类名。
Spring注解——同一接口有多个实现类,如何注入相关推荐
- Spring 当一个接口多个实现时,怎么注入
为什么80%的码农都做不了架构师?>>> 代码如下 Data.java package cn.lpe234.demo;/*** Created by lpe234 on 201 ...
- java spring注解教程,spring注解
spring注解 扫描指定的包中的类上的注解,常用的注解有: @Controller 声明Action组件 @Service 声明Service组件 @Service("myMo ...
- Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法
一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...
- java spring框架 注解_史上最全的java spring注解
史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...
- Spring学习(五)——Spring注解(一)
---恢复内容开始--- 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射 ...
- Spring注解创建Bean的几种方式
Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...
- 学会使用Spring注解
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- Spring注解详解
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- 在Servlet中获取Spring注解的bean
最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理 ...
- Spring注解使用方法
Spring框架从创建伊始就致力于为复杂问题提供强大的.非侵入性的解决方案.Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop.con ...
最新文章
- startos 5.1 如何 root 登陆
- ArcGIS地理信息系统空间分析实验教程第一章 导论
- JSP知识点笔记-基本技术常识
- [渝粤教育] 中国地质大学 大学英语(2) 复习题
- POJ - 2069 Super Star HDU - 3007 Buried memory
- iOS:Reachability网络监听
- 体验MSN聚酷(Juku)
- Android6.0之AMS如何启动app中篇之Task的管理
- NetLog 大规模应用实战:Database-sharding 技术
- 网页截长图、全图的方法
- 计算机max函数的格式,Word怎么输入Max公式
- 【NVIDIA Jetson TK1】一,开发板重装ubuntu系统,重新刷机,重新烧系统,恢复系统
- ear的英语怎么念_ears用英语怎么读?
- 数组首地址arry和arry的区别
- 微信小程序开发:组件
- 灵异事件之idea和金山词霸
- Codeforces Round #766 (Div. 2) B. Not Sitting
- SVN:回滚到旧版本(TortoiseSVN)
- 佳能Canon imageRUNNER ADVANCE C9060 驱动
- 这样查找热点新闻素材,3招帮你提升公众号阅读量
热门文章
- cocos2d-x-3.0 window+eclipse Android Project 环境与开发新手教程
- JAVA-初步认识-第十章-多态-类型判断-instanceof
- ios为了用户隐私安全,禁止自动播放音频文件的解决办法(微信端)
- fzu 2037 Maximum Value Problem
- [洛谷5463]小鱼比可爱
- 六企业级开源仓库nexus3实战应用–使用nexus3配置yum私有仓库
- VS Code 中文注释显示乱码
- shutil模块拷贝与解压缩模块----day19
- python线程,进程,队列和缓存
- (并查集)~APTX4869(fzu 2233)