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

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. startos 5.1 如何 root 登陆
  2. ArcGIS地理信息系统空间分析实验教程第一章 导论
  3. JSP知识点笔记-基本技术常识
  4. [渝粤教育] 中国地质大学 大学英语(2) 复习题
  5. POJ - 2069 Super Star HDU - 3007 Buried memory
  6. iOS:Reachability网络监听
  7. 体验MSN聚酷(Juku)
  8. Android6.0之AMS如何启动app中篇之Task的管理
  9. NetLog 大规模应用实战:Database-sharding 技术
  10. 网页截长图、全图的方法
  11. 计算机max函数的格式,Word怎么输入Max公式
  12. 【NVIDIA Jetson TK1】一,开发板重装ubuntu系统,重新刷机,重新烧系统,恢复系统
  13. ear的英语怎么念_ears用英语怎么读?
  14. 数组首地址arry和arry的区别
  15. 微信小程序开发:组件
  16. 灵异事件之idea和金山词霸
  17. Codeforces Round #766 (Div. 2) B. Not Sitting
  18. SVN:回滚到旧版本(TortoiseSVN)
  19. 佳能Canon imageRUNNER ADVANCE C9060 驱动
  20. 这样查找热点新闻素材,3招帮你提升公众号阅读量

热门文章

  1. cocos2d-x-3.0 window+eclipse Android Project 环境与开发新手教程
  2. JAVA-初步认识-第十章-多态-类型判断-instanceof
  3. ios为了用户隐私安全,禁止自动播放音频文件的解决办法(微信端)
  4. fzu 2037 Maximum Value Problem
  5. [洛谷5463]小鱼比可爱
  6. 六企业级开源仓库nexus3实战应用–使用nexus3配置yum私有仓库
  7. VS Code 中文注释显示乱码
  8. shutil模块拷贝与解压缩模块----day19
  9. python线程,进程,队列和缓存
  10. (并查集)~APTX4869(fzu 2233)