【Spring】为什么不建议使用@Autowired

news2024/9/19 22:21:09

【Spring】为什么不建议使用@Autowired

  • 开篇词:
  • 干货篇:
      • 1.知识回顾
      • 2.@Autowired和其他注入方式的对比
          • 1.@Autowired 注入(字段注入)
          • 2.构造器注入
          • 3.Setter 方法注入
      • 3.为什么spring官方不推荐使用
          • 1. 违反封装原则
          • 2. 依赖关系不明确
          • 3. 难以进行单元测试
          • 4. 可能导致空指针异常
          • 5. 依赖注入的歧义性
  • 总结篇:
  • 我是杰叔叔,一名沪漂的码农,下期再会!

开篇词:

最近提交PR后,有同事添加了comments:建议@autowired替换为构造器注入,正好借此来聊一下这个司空见惯的注解
在这里插入图片描述

干货篇:

1.知识回顾

@Autowired 是 Spring 框架中的一个注解,用于实现依赖注入(Dependency Injection, DI)。在 Spring 应用程序中,

@Autowired 可以自动地将一个 bean 注入到另一个 bean 中,前提是 Spring 容器中存在该类型的 bean。这使得 Spring 应用程序的组件之间的耦合度降低,提高了代码的可测试性和可维护性。

2.@Autowired和其他注入方式的对比

1.@Autowired 注入(字段注入)

优点:

  • 简单易用:只需在字段上添加 @Autowired 注解,Spring 容器会自动注入匹配的 bean,减少了代码量。
  • 灵活性高:可以在类的任何字段上使用,不受限制。

缺点:

  • 依赖关系不明确:其他开发者难以一眼看出类的依赖关系,增加了理解和维护的难度。
  • 难以测试:由于依赖是自动注入的,测试时难以替换或模拟依赖对象。
2.构造器注入

优点:

  • 明确依赖关系:通过构造器参数明确指定了类的依赖关系,提高了代码的可读性和可维护性。
  • 支持不可变对象:可以注入 final 修饰的字段,确保对象在创建后不会被修改。
  • 避免循环依赖:Spring 容器能够自动检测并处理构造器注入中的循环依赖问题。
  • 有利于单元测试:可以通过构造器注入模拟或替换依赖对象,便于编写单元测试。

缺点:

  • 灵活性较低:对类的依赖关系有严格的顺序要求,可能导致代码不够灵活。
  • 启动时间稍长:由于需要处理依赖关系的顺序和循环依赖问题,可能会稍微增加应用的启动时间。
3.Setter 方法注入

优点:

  • 灵活性高:可以在对象创建后通过 Setter 方法注入依赖,支持依赖的延迟加载。
  • 支持可选依赖:如果依赖不是必需的,可以在 Setter 方法中处理 null 值,避免空指针异常。
  • 有利于单元测试:与构造器注入类似,可以通过 Setter 方法注入模拟或替换依赖对象。

缺点:

  • 依赖关系不够明确:虽然比字段注入稍好一些,但依赖关系仍然不够直观。
  • 可能违反单一职责原则:如果 Setter 方法过多,可能会使类的职责不够单一。

3.为什么spring官方不推荐使用

在这里插入图片描述

1. 违反封装原则

直接在类的成员变量上使用@Autowired会导致类的内部状态对外部可见,这违反了面向对象编程中的封装原则。封装是面向对象编程的核心概念之一,它要求将对象的内部状态隐藏起来,只对外提供有限的接口进行交互。字段注入破坏了这种封装性,使得类的内部状态变得不可控,增加了潜在的风险。

2. 依赖关系不明确

字段注入将依赖关系隐藏在类的内部,使得类的依赖关系不明显。这会导致代码的可读性和可维护性下降。其他开发者在阅读代码时,很难一眼看出该类依赖于哪些其他类,从而增加了理解和修改代码的难度。

3. 难以进行单元测试

由于依赖的实例是自动注入的,测试时很难对依赖进行模拟或替换。这会增加单元测试的复杂性,并且可能导致测试覆盖率不足。相比之下,构造器注入或Setter方法注入使得依赖关系更加明确,便于在测试时通过构造器或Setter方法注入模拟对象。

4. 可能导致空指针异常

在字段注入的情况下,如果Spring容器中没有找到匹配的bean,那么注入的字段将保持为null。这可能导致在后续的代码执行中出现空指针异常(NPE),而这种异常在编译时是无法检测到的,只能在运行时才能发现。

5. 依赖注入的歧义性

如果Spring容器中存在多个相同类型的bean,并且你尝试使用@Autowired进行注入,那么Spring将无法确定应该注入哪一个bean,从而导致异常。虽然可以通过@Qualifier注解来指定要注入的bean的名称,但这增加了代码的复杂性和出错的可能性。

总结篇:

Spring官方不推荐使用@Autowired进行字段注入的主要原因是它违反了封装原则、导致依赖关系不明确、难以进行单元测试、可能导致空指针异常以及存在依赖注入的歧义性。为了编写更加健壮、易于理解和维护的代码,建议采用构造器注入或Setter方法注入作为依赖注入的替代方案。

在这里插入图片描述

我是杰叔叔,一名沪漂的码农,下期再会!

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

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

相关文章

yolo V8训练 长条状目标

1、说明 目标数据集合中有很多长条状图片&#xff0c;如果直接Resize 会严重拉伸&#xff0c;因此采用把长条图像裁剪成2段&#xff0c;然后将裁剪后的2段图片拼接在一起。 2、代码 2.1 C 代码 &#xff08;部署&#xff0c;模型推理时C &#xff09; #include <stdio.h…

讯飞星火极速超拟人交互技术:语音端到端,8 月底开放;昆仑万维发布 AI 短剧平台 SkyReels丨RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

Linux驱动开发基础(中断)

所学来自百问网 目录 1. 嵌入式中断系统 2. 中断处理流程 3. 异常向量表 4. Linux系统对中断的处理 4.1 ARM 处理器程序运行的过程 4.2 保护现场 5. Linux 系统对中断处理的演进 5.1 硬件中断和软件中断 5.2 中断拆分(上半部和下半部) 5.2.1 tasklet 5.2.2 工作队列…

iPad协议08算法新版

iPad协议是一种模拟iPad端微信的人工操作&#xff0c;并与微信服务器进行通信的协议。该协议涉及到一些关键点&#xff0c;包括PB协议、mmtls、07加密算法、rqt算法、aes加密、rsa加密等。只要理解了这些关键点&#xff0c;就可以模拟官方微信的所有功能&#xff0c;并且还可以…

基于STM32开发的智能家用能源管理系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化能源监测与数据处理能源管理与控制Wi-Fi通信与远程监控应用场景 家庭能源使用优化智能电力监控常见问题及解决方案 常见问题解决方案结论 1. 引言 随着能源需求的不断增长和环境保…

redis随笔记

缓存穿透。key不存在。恶意攻击、代码问题。加布隆过滤器&#xff0c;或者为空就返回。 缓存失效&#xff08;击穿&#xff09;。key刚好过期。缓存时间随机数。 缓存雪崩。缓存层宕机&#xff0c;一下子袭击数据库。缓存高可用、限流熔断、提前演练。 布隆过滤器就是一个key…

文档透明加密软件是什么?有哪些功能?一文给您详解!

文档透明加密软件是一种在不影响用户正常操作习惯的前提下&#xff0c;自动对电子文档进行加密和解密的技术解决方案。 其核心特点在于“透明性”&#xff0c;即用户在打开、编辑或保存文档时&#xff0c;无需进行任何额外的加密或解密操作&#xff0c;这些过程均在系统后台自…

【深度学习】【多模态】使用MiniCPM-V 2.6进行图片OCR

文章目录 ocr评价ocr 下载项目:https://huggingface.co/openbmb/MiniCPM-V-2_6 准备一个图片’test.jpg’。 将下面的python中的目录地址换成MiniCPM-V-2_6项目所在地址。然后执行: # test.py import torch from PIL import Image from transformers import AutoModel, Aut…

网络主播被正式认定为国家新职业

网络主播这一职业正式获得国家认可&#xff0c;标志着这一工作已成为一项正当且受认可的职业&#xff0c;而不再只是灵活就业的选项。近日&#xff0c;人力资源和社会保障部公布了新增的19个新职业信息&#xff0c;其中包括网络主播。对于从事直播行业的人来说&#xff0c;这是…

zabbix实战-磁盘空间告警

1.创建监控项 选择&#xff1a;键值&#xff1a;vfs.fs.size[fs,<mode>] 。 直接写 vfs.fs.size[fs,<mode>]是不出数据的。我们要写具体的值 &#xff1a;vfs.fs.size[/,free] &#xff0c;这个表示查看根的剩余空间。 2.创建图形 为磁盘剩余空间监控项创建图形&am…

cdn刷新预热

1、访问 cdn 控制台的 刷新预热 页面&#xff0c;填写需要刷新预热的url地址 阿里云&#xff1a; 腾讯云&#xff1a; 2、通过调用cdn的api接口刷新预热 阿里云&#xff1a; 调用RefreshObjectCaches-刷新缓存_CDN(CDN)-阿里云帮助中心 调用PushObjectCache-预热URL_CDN(CD…

前端宝典九:React Native从入门到精通实战

本文主要介绍 React Native新旧框架对比React与React Native区别React Native性能优化 其中第3点React Native性能优化的拆包分包&#xff0c;是项目实战中使用过的&#xff0c;在这里整理分享&#xff0c;如果没有用过的小伙伴会觉得晦涩难懂&#xff0c;建议按照在实际项目…

【等保测评】IIS模拟测评

一、身份鉴别 a)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b; 结果记录&#xff1a;此项不适用&#xff0c;IIS中间件无管理控制台&#xff0c;身份鉴别功能依赖于所部署的服务器 b)应具有…

计算机毕业设计 心理健康服务系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

创新驱动发展,SiLM5768LCG-DG 支持输入输出同相逻辑 带互锁功能的六通道数字隔离器 科技稳健赋能,工业汽车应用安全升级!

SiLM5768Lx系列带互锁功能的六通道数字隔离器选型表: SiLM5768LCG-DG:支持输入输出同相逻辑 SiLM5768LNCG-DG:支持输入输出反相逻辑 数字隔离器广泛应用于工业、汽车和通信等领域&#xff0c;为系统中的强电和弱电电路提供了安全、可靠的电气隔离解决方案&#xff0c;确保强…

【TCP】核心机制:延时应答、捎带应答和面向字节流

文章目录 延时应答捎带应答面向字节流粘包问题方案一&#xff1a;指定分隔符方案二&#xff1a;指定数据的长度 TCP 报头首部长度保留&#xff08;6 位&#xff09;选项序号确认序号 延时应答 尽可能降低可靠传输带来的性能影响 提升性能>让滑动窗口变大 如果我们立即返回 …

Chat App 项目之解析(二)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

Docker最佳实践进阶(二):Docker Compose部署SpringCloud微服务项目

大家好&#xff0c;在上篇文章中博主演示了Dockerfile常用的命令&#xff0c;以及如何利用Dockerfile构建镜像&#xff0c;生成容器服务&#xff0c;但是在实际应用环境中&#xff0c;特别是在微服务架构中&#xff0c;一个应用系统可能包含多个微服务&#xff0c;每个微服务可…

软数据与硬数据的深度解析:住宅代理如何优化数据抓取

引言 什么是软数据&#xff1f;有哪些类型&#xff1f; 什么是硬数据&#xff1f;有哪些类型&#xff1f; 软数据和硬数据的区别是什么&#xff1f; 如何收集软数据和硬数据&#xff1f; 如何优化抓取软数据和硬数据&#xff1f; 总结 引言 在大数据时代&#xff0c;企业…

Sanic 和 Go Echo 对比

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…