面试问到Spring中的@Autowired注解,可以这样答

前言

在Spring框架中,依赖注入是一个核心概念,它允许将一个对象的依赖关系外部化并由Spring容器来管理。@Autowired注解是实现这一点的关键工具之一。当然,这块知识也是面试官们老生常谈的问题。

下面就跟着博主的步伐,一起来探讨@Autowired注解相关知识点吧!

在这里插入图片描述

@Autowired注解基础

@Autowired注解可以用于构造函数、setter方法、字段以及配置方法上,以指示Spring自动注入相应的bean。它的工作原理基于类型匹配,Spring容器会查找与所需类型匹配的bean,并自动注入。

字段注入

@Component  
public class MyComponent {  @Autowired  private MyDependency dependency;  
}

构造函数注入

在写代码时,博主推荐的做法是使用构造函数注入,因为它可以使类更易于测试,并且确保了依赖项在对象创建时就已经设置。

@Component  
public class MyComponent {  private final MyDependency dependency;  @Autowired  public MyComponent(MyDependency dependency) {  this.dependency = dependency;  }  
}

Setter方法注入

虽然setter注入不如构造函数注入受欢迎,但在某些情况下,它可能是必要的。

@Component  
public class MyComponent {  private MyDependency dependency;  @Autowired  public void setDependency(MyDependency dependency) {  this.dependency = dependency;  }  
}

解析流程与原理

当Spring容器启动时,它会扫描所有标注了@Component(或其派生注解如@Service, @Repository, @Controller等)的类,并创建相应的bean定义。当遇到@Autowired注解时,Spring会查找匹配的bean来注入

匹配规则基于类型。比如,如果有一个类型为MyDependency的字段标注了@Autowired,Spring会查找类型为MyDependency的bean进行注入。如果有多个匹配的bean,则需要使用@Qualifier注解来指定具体的bean

相同Bean的案例分析:多例与冲突解决

当Spring容器中存在多个相同类型的bean时,使用@Autowired可能会导致冲突。比如下面的场景:

假设我们有两个实现了同一个接口的bean:

@Component("firstBean")  
public class FirstBean implements MyInterface { /*...*/ }  @Component("secondBean")  
public class SecondBean implements MyInterface { /*...*/ }

如果我们在另一个组件中尝试自动装配这个接口的实例:

@Component  
public class MyComponent {  @Autowired // 这里会发生什么?  private MyInterface myInterface;  
}

在这种情况下,Spring会抛出NoUniqueBeanDefinitionException,因为它不清楚应该注入哪一个实现。为了解决这个问题,我们可以使用@Qualifier注解来指定具体的bean名称:

@Component  
public class MyComponent {  @Autowired  @Qualifier("firstBean") // 指定要注入的bean名称  private MyInterface myInterface;  
}

另一种解决方法是使用Java配置或XML配置来显式声明bean的关系

@Autowired和@Resource注解的区别

这种问法也是面试官经常问到的典型问题!接下来详细介绍一下这块知识点。

首先是它们的依赖查找方式不同。

  • @Autowired默认按照类型(byType)进行自动装配的。上文提到过,如果存在多个相同类型的bean,需要配合@Qualifier注解来指定bean的名称(byName),或者确保需要注入的字段、方法参数或构造函数参数是唯一的。
  • @Resource默认按照名称(byName)进行装配,它会查找与指定名称相同的bean。如果找不到匹配的bean,它会退回到按照类型(byType)进行查找。So,@Resource可以指定名称(通过name属性)和类型(通过type属性,但通常不需要指定,因为Java编译器会推断出类型)。

同时,它们的使用方式也有所不同。

@Autowired可以标注在构造器、方法、参数、字段上,以支持构造器注入、setter注入和字段注入。
而@Resource也可以标注在字段和方法上,但通常更常见于字段注入。

对于强制依赖问题,他们的表现如下:

@Autowired有一个required属性,默认为true,表示被注入的bean是必需的。如果找不到匹配的bean,Spring容器在启动时会抛出异常。当设置为false时,如果找不到bean,则不会报错,但相关字段会被设置为null。
@Resource没有直接提供类似的属性,但可以通过Java的@Nullable注解来标明某个字段可以为null。

总结与最佳实践

博主在此做个小结,各位小伙伴们记住了哟:

  • 优先使用构造函数注入,因为它更加不可变且易于测试。
  • 当存在多个匹配的bean时,使用@Qualifier来消除歧义。
  • 尽量避免在字段上使用@Autowired,因为这会使代码更难以理解和测试;应该考虑使用构造函数或setter方法注入。

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GCANet去雾算法

目录 1. 引言 2. 门控上下文注意机制(GCA) 3. 去雾流程 4. 模型代码 5. GCANet的优势 6. 去雾效果 1. 引言 GCANet(Gate-Controlled Attention Network)是一种用于图像去雾的深度学习算法,通过引入注意力机制来改进传统的去雾方法&…

大模型场景应用汇总(持续更新)

一、应用场景 1.办公场景 智能办公:文案生成(协助构建大纲优化表达内容生成)、PPT美化(自动排版演讲备注生成PPT)、数据分析(生成公式数据处理表格生成)。 智能会议:会议策划&…

密码学基础概念

加密性 什么是加密? 1.对原有的明文数据,执行某种运算,得到密文数据。 2.密文数据对于未授权人员而言,在一定上程度上加大了解读的难度 3.加密功能用于实现机密性 什么是密钥? 1.如同持有保险柜钥匙才能打开保险柜…

排序进阶----插入排序,希尔排序

各位看官们好,接下来鄙人想与大家分享的实现被称为六大排序之一的插入排序。其实关于这六大排序在我们最开始就已经接触过了。我们在最开始学习c语言的时候,我们要学习到其中之一的冒泡排序。虽然现在看起来冒泡排序确实是没有太大的实际效果&#xff0c…

618必买的数码好物有哪些?盘点兼具设计与实用的数码好物分享

随着618购物节的到来,数码爱好者们又开始跃跃欲试,期待在这个年度大促中寻找到自己心仪的数码好物,在这个数字化时代,数码产品不仅是我们日常生活的必需品,更是提升生活品质的重要工具,那么在众多的数码产品…

HNU-计算机体系结构-实验1-RISC-V流水线

计算机体系结构 实验1 计科210X 甘晴void 202108010XXX 1 实验目的 参考提供为了更好的理解RISC-V,通过学习RV32I Core的设计图,理解每条指令的数据流和控制信号,为之后指令流水线及乱序发射实验打下基础。 参考资料: RISC-…

Ubuntu20.04升级到22.04之后出现的问题

项目场景: 之前一致使用的是Ubuntu20.04,虽然丑了点,但是用着没什么问题,最近没能按捺住好奇心,升级到了22.04,升级后颜值有所提高,但是也带来了一些问题。 从20.04升级到22.04,起始…

sendmail发送邮件配置详解?如何正确设置?

sendmail发送邮件如何保障安全?AokSend有何安全措施? 为了确保sendmail发送邮件的高效性和安全性,正确配置是至关重要的。本文将详细介绍sendmail发送邮件的配置步骤,并探讨如何保障sendmail发送邮件的安全性。同时,我…

界面控件DevExpress WinForms的流程图组件 - 可完美复制Visio功能(一)

DevExpress WinForms的Diagram(流程图)组件允许您复制Microsoft Visio中的许多功能,并能在下一个Windows Forms项目中引入信息丰富的图表、流程图和组织图。 P.S:DevExpress WinForms拥有180组件和UI库,能为Windows F…

2024年中国金融行业网络安全研究报告

网络安全一直是国家安全的核心组成部分,特别是在金融行业,金融机构拥有大量的敏感数据,包括个人信息、交易记录、财务报告等,这些数据的安全直接关系到消费者的利益和金融市场的稳定,因此金融行业在网络安全建设领域一…

成都市酷客焕学新媒体科技有限公司:助力品牌打破困境!

在数字化浪潮的推动下,营销策略对品牌的发展愈发关键。成都市酷客焕学新媒体科技有限公司,作为短视频营销领域的佼佼者,凭借其卓越的策略和实力,助力众多品牌在信息海洋中脱颖而出,实现品牌的显著增长。 酷客焕学专注于…

部署八戒-Chat-1.8B 模型

1 简单介绍 八戒-Chat-1.8B 八戒-Chat-1.8B是运用 InternLM2-Chat-1.8B 模型进行微调训练的优秀成果。其中,八戒-Chat-1.8B 是利用《西游记》剧本中所有关于猪八戒的台词和语句以及 LLM API 生成的相关数据结果,进行全量微调得到的猪八戒聊天模型。作为 …

python-使用API

python-使用API 使用github的api-即url地址请求数据 https://api.github.com/search/repositories?qlanguage:python&sortstars #这个调用返回GitHub当前托管了多少个Python项目,还有有关最受欢迎的Python仓库的信息。在浏览器中输入上面地址可以看到该接口&…

论文《Sensor and Sensor Fusion Technology in Autonomous Vehicles: A Review》详细解析

论文《Sensor and Sensor Fusion Technology in Autonomous Vehicles: A Review》详细解析 摘要 该论文对自动驾驶汽车中的传感器和传感器融合技术进行了全面回顾。它评估了各种传感器(如相机、LiDAR、雷达)的能力和技术性能,并讨论了多传感…

fastadmin部署后JSHint报错,导致Config::getValueByName()无法获取到值

问题 解决方案 一、本地 在phpstorm中,依次点击【设置】-【JSHint】-【取消勾选Enable】-【应用】即可。

无需安装的在线PS:打开即用

为什么想用在线PS网页版?Photoshop常用于平面设计,是不少设计师接触过的第一款设计软件。作为一款平面设计工具,ps功能太多,并且没有在线版,这不仅需要设计师花费时间学习软件,还需要设计师具备一定的设计能…

正邦科技(day2)

自动校准 问题:电量不准都可以直接去校准 校准方式:可程式变频电压 问题分析:他是通过软件去自动自动校准的,flash 清空的时候有缓存没有清空,或者互感器没有读取到问题 互感器:电流互感器的作用包括电流测…

【DrissionPage爬虫库 1】两种模式分别爬取Gitee开源项目

文章目录 DrissionPage爬虫库简介1. 浏览器操控模式(类似于游戏中的后台模拟鼠标键盘)2. 数据包收发模式(类似于游戏中的协议封包) 实战中学习需求:爬取Gitee开源项目的标题与描述解决方案1:用数据包方式获…

SSL证书:守护个人信息安全的坚固盾牌

在数字化浪潮汹涌的今天,我们的个人信息如同一座座宝藏,吸引着不法分子的贪婪目光。数据泄露事件频发,让信息安全问题日益凸显。而在这个信息爆炸的时代,如何保护我们的个人信息安全,成为了一个亟待解决的问题。幸运的…

股票量化交易上手,一个特别简单却长期可用的交易策略,官方接口

股票实现程序化自动化交易的三个基础:获取数据、执行交易、查询账户。 以后说到策略示例的时候就不介绍接口的基础使用方法了,随便一个策略把过程写出来都会很啰嗦,尽量压缩内容吧,这些内容是面向新手的,大佬们忽略细节…