面试题:注入Bean的注解都有哪些?-程序员宅基地

技术标签: spring  java  面试题合集  

常用注解总结

Annotaion Package Source
@Autowired org.springframework.bean.factory Spring 2.5+
@Resource javax.annotation Java JSR-250
@Inject javax.inject Java JSR-330

由上边的三个图可以看出最常见的有三个,Spring 内置的 @Autowired 以及 JDK 内置的 @Resource 和 @Inject 都可以用于注入 Bean。

一般在工作中,@Autowired 和@Resource使用的比较多一些。

@Autowired 和 @Resource 的区别是什么?

Autowired 属于 Spring 内置的注解,默认的注入方式为byType根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类)。

如果一个接口只有一个实现类还行,如果有多个就有问题了,当一个接口存在多个实现类的话,byType这种方式就无法正确注入对象了,因为这个时候 Spring 会同时找到多个满足条件的选择,默认情况下它自己不知道选择哪一个。

这种情况下,注入方式会变为 byName(根据名称进行匹配),这个名称通常就是类名(首字母小写)。就比如说下面代码中的 smsService 就是我这里所说的名称,这样应该比较好理解了吧。

// smsService 就是我们上面所说的名称
@Autowired
private SmsService smsService;

举个例子,SmsService 接口有两个实现类: SmsServiceImpl1和 SmsServiceImpl2,且它们都已经被 Spring 容器所管理。

// 报错,byName 和 byType 都无法匹配到 bean
@Autowired
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Autowired
private SmsService smsServiceImpl1;
// 正确注入  SmsServiceImpl1 对象对应的 bean
// smsServiceImpl1 就是我们上面所说的名称
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;

我们还是建议通过 @Qualifier 注解来显示指定名称而不是依赖变量的名称。

@Resource属于 JDK 提供的注解,默认注入方式为 byName如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType

@Resource 有两个比较重要且日常开发常用的属性:name(名称)、type(类型)

public @interface Resource {
    String name() default "";
    Class<?> type() default Object.class;
}

如果仅指定 name 属性则注入方式为byName,如果仅指定type属性则注入方式为byType,如果同时指定name 和type属性(不建议这么做)则注入方式为byType+byName

// 报错,byName 和 byType 都无法匹配到 bean
@Resource
private SmsService smsService;
// 正确注入 SmsServiceImpl1 对象对应的 bean
@Resource
private SmsService smsServiceImpl1; //这个地方就是根据这个名字smsServiceImpl1  首字母变成大写去找对应的对象的。
// 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式)
@Resource(name = "smsServiceImpl1")
private SmsService smsService;

简单总结一下

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  • Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。
  • 当一个接口存在多个实现类的情况下,@Autowired 和@Resource都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 @Qualifier 注解来显示指定名称@Resource可以通过 name 属性来显示指定名称。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yifeichen1/article/details/125662330

智能推荐

政安晨:示例演绎机器学习中(深度学习)神经网络的数学基础——快速理解核心概念(一){两篇文章讲清楚}_演绎学习(机器学习)-程序员宅基地

文章浏览阅读1.7k次,点赞46次,收藏28次。进入人工智能领域免不了与算法打交道,算法依托数学基础,很多小伙伴可能新生畏惧,不用怕,算法没那么难,也没那么玄乎,未来人工智能时代说不得人人都要了解算法、应用算法。本文试图以一篇文章,用程序演绎的方式给大家把这里面的数学基础先讲清楚,以便于咱们未来深入,呵呵。机器学习中,那些“机器”学习的是什么?——数据。学习到的是什么?——模式和规律(或者说是可以解决实际问题的模型)。_演绎学习(机器学习)

ajax面试题大全-程序员宅基地

文章浏览阅读137次。ajax面试题大全1、Ajax的最大的特点是什么2、ajax的缺点3、ajax请求时,如何解释json数据4、ajax请求的时候get 和post方式的区别5、什么是Ajax和JSON,它们的优缺点6、简述ajax 的过程7、解释jsonp的原理,以及为什么不是真正的ajax ...

Dubbo学习文档_dubbo文档-程序员宅基地

文章浏览阅读447次。Dubbo学习_dubbo文档

【IDEA】IDEA导入SSM项目步骤(带Maven)_从github下载的ssm项目源码怎么在idea中运行-程序员宅基地

文章浏览阅读7.2k次,点赞4次,收藏36次。1 导入pom.xml文件注意:这一步选择的是Open选项,而不是Import Project。注意:此处选择的是tmall_ssm项目目录下的pom.xml文件,而不是选择tmall_ssm项目目录。注意:选择Open as Project。2 同步Maven包IDEA会自动下载pom.xml文件中所依赖的jar包。下载目录为家目录/.m2/repository/。出现上图所示的标识后,表示所有的jar包已经同步完成,可以通过tomcat运行项目了。..._从github下载的ssm项目源码怎么在idea中运行

汽车行业常见术语英文缩写(持续更新...)_汽车专业术语缩写-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏18次。序号缩写中文英文1ABS防抱死制动系统Anti-lock Braking System2EVAP蒸发排放系统Evaporative Emission System3EGR废气再循环Exhaust Gas Recirculation4ESIM蒸发系统完整性监测Evapor System Integraty Monitor5EPB电子驻车制动系统Electrical Park Brake6EBD电子制动力分配Electro..._汽车专业术语缩写

寻找...-程序员宅基地

文章浏览阅读280次。菜鸟程序员寻找人教我会很虚心学习的希望有人愿意教我

随便推点

国外开源的PACS服务器-程序员宅基地

文章浏览阅读729次。国外开源的PACS服务器罗朝辉(http://www.cnblogs.com/kesalin/)本文遵循“署名-非商业用途-保持一致”创作公用协议 名称:Dcm4che评级:★★★★★开源许可:GPL LGPL MPL功能: 影像处理,影像归档,影像管理,影像传输,Worklist支持标准:DICOM,HL7,IHE,MPPS,WADO语言:英语客户端: 桌面,基于web平台:跨平台编程语..._clearcanvas开源pacs系统

字节跳动高频100道核心前端面试题解析-程序员宅基地

文章浏览阅读3.4k次。字节跳动的前端一直是大热之选,薪资和技术都是国内的最前沿。本文将为大家简单介绍一下字节技术岗的职级体系和相应的技术要求。并给大家分享一套高质量面试题:「由字节资深前端大佬整理的100道高频..._字节跳动前端面试题

HTML-Emmet(神器)_html 神器-程序员宅基地

文章浏览阅读709次。使用Emmet必须先安装插件,我用atom 安装插件翻墙什么的我就不写了 在这里我推荐两个学习emmet语法的网页 日常链接嘻嘻 前人总结的emmet语法使用,有动态图演示,新手推荐 官方语法_html 神器

Zigbee入门概念及背景知识_zigbee背景-程序员宅基地

文章浏览阅读700次。在学习Zigbee之前,需要了解与单片机学习的方法不同之处以及难点所在。学习Zigbee需要掌握协议栈和网络等相关知识,任务量较大。Zigbee的资料相对较少,初学者学习起来比较费劲,学习效果不理想。学习过程中需要利用软件和硬件工具,提高学习效率。Zigbee是一种无线通信方式,用于构建无线局域网,可以用于家居、工业、矿产、农业、医疗等领域。相比蓝牙和WIFI,Zigbee可以组建大规模网络,功耗低,但通信速率较小。Zigbee和以太网组网技术有所不同,用途、拓扑结构和通信特性等方面存在差异。Zigbee的_zigbee背景

HTTP中的GET和POST方法详解_http post get-程序员宅基地

文章浏览阅读1.4w次,点赞18次,收藏100次。一般来说GET是获取数据,POST是提交数据的。但是因为GET和POST都是HTTP的方法,HTTP又是是基于TCP/IP的关于数据在万维网中如何让通讯的协议。从本质上讲,GET和POST都是HTTP请求,都是TCP链接,是无区别的。但是HTTP协议既然有了这两个方法,就是为了在特定的情况下区分应用。1、GET是获取数据,POST是提交数据的。GET方法通常用于请求服务器发送某个资源,而且应该是安全的和幂等的。仅仅是获取资源信息,就像数据库查询一样,不会修改和增加数据,不会影响资源的状态。POST_http post get

初识 MongoDB_本关任务:根据编程要求启动 mongodb 服务。-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏28次。第1关:启动 MongoDB本关任务:根据编程要求启动 MongoDB 服务。第2关:启动 MongoDB 多实例本关任务:根据第一关单实例(服务)的启动教程,按照编程要求,启动两组实例(服务)。第3关:退出客户端和关闭 MongoDB 服务本关任务:关闭端口为27017的 MongoDB 服务。标题..._本关任务:根据编程要求启动 mongodb 服务。