先写一个场景,举例说明:

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注解——同一接口有多个实现类,如何注入相关推荐

  1. Spring 当一个接口多个实现时,怎么注入

    为什么80%的码农都做不了架构师?>>>    代码如下 Data.java package cn.lpe234.demo;/*** Created by lpe234 on 201 ...

  2. java spring注解教程,spring注解

    spring注解 扫描指定的包中的类上的注解,常用的注解有: @Controller 声明Action组件 @Service    声明Service组件    @Service("myMo ...

  3. Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法

    一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...

  4. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  5. Spring学习(五)——Spring注解(一)

    ---恢复内容开始--- 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射 ...

  6. Spring注解创建Bean的几种方式

    Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...

  7. 学会使用Spring注解

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  8. Spring注解详解

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  9. 在Servlet中获取Spring注解的bean

    最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理 ...

  10. Spring注解使用方法

    Spring框架从创建伊始就致力于为复杂问题提供强大的.非侵入性的解决方案.Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop.con ...

最新文章

  1. Cocoapods安装过程【转载】
  2. 鸟哥的Linux私房菜基础学习篇(第二版)第二章课后习题与答案
  3. 创业,宁愿单兵作战也不要参在拙劣的团队里继续寻觅队友
  4. 树视图的代码 TreeView
  5. 原来python中实现语音识别如此简单!
  6. STM32F103单片机使用DMA功能读取ADC采样数据
  7. http://snaps.php.net,科技常识:Windows下编译PHP和memcache扩展教程
  8. 深入解析LoadRunner下的参数化取值
  9. Succinctly 中文系列教程(三)20220109 更新
  10. java debug命令_Mame DEBUG调试命令详细指令速查大全
  11. 7-14 设计一个风扇Fan类 (20 分)
  12. 基于Bmob的仿微信即时聊天软件
  13. 数据分析 -- Pandas①
  14. c++名字空间使用示例
  15. IDEA 的 Othere Settings(Default settings)消失了?
  16. 中高级前端面试知识点汇总
  17. 动态规划 - N步台阶问题
  18. 大型直播平台应用架构浅谈
  19. 火狐浏览器打不开,但是进程中有,怎么办?
  20. Android颜色对照表

热门文章

  1. 《基于Nginx的中间件架构》学习笔记---3.nginx的目录分析
  2. SpringBoot使用RestTemplate 摘要认证
  3. jpg、jpeg、png... 的区别
  4. [转]怎么查看端口占用情况?
  5. Beginning WF 4.0翻译——第一章(创建一个简单的工作流)续二
  6. Safe3通用远程溢出漏洞扫描系统
  7. GetHashCode 方法 并不能保证值唯一
  8. 利用网络媒体搭建自己就业之“桥”——卖糖葫芦北大毕业生谋职报道带来的启示...
  9. 【MM系列】SAP 通过原材料找到成品的函数
  10. hdu2089不要62(数位dp)