当前位置: 首页 > news >正文

为什么Spring不推荐@Autowired用于字段注入

背景

  • Spring是Java程序员常用的框架之一。
  • 官方从Spring 4.0开始不推荐使用@Autowired进行字段注入。

Spring注入方式

  1. 基于构造器注入:在构造器上使用@Autowired。

    • 优点:可以声明字段为final,确保字段在构造时被初始化。
  2. 基于setter方法注入:在setter方法上使用@Autowired。

    • 优点:在无参数构造器或工厂方法实例化Bean时,Spring会调用setter方法注入依赖。
  3. 基于字段注入:在字段上使用@Autowired。

    • 优点:最简洁,无需getter和setter代码,无需声明构造函数。

基于字段注入的缺点

  1. 容易引发NPE:Spring不会对依赖的bean是否为null进行判断,可能导致运行时的空指针异常。
  2. 缓解单一职责原则的违反:字段注入隐藏了依赖关系,可能导致代码质量降低。

Spring官方推荐

  • 推荐使用基于构造器注入的方式。

循环依赖问题

  • 构造器注入可能存在循环依赖问题。
  • 解决方案:
    1. 重构代码:消除循环依赖,可能成本较高。
    2. 使用@Lazy注解:延迟初始化bean,解决循环依赖。

总结

  • Spring提供三种注入方式:字段注入、setter方法注入、构造器注入。
  • 官方不推荐使用@Autowired进行字段注入,主要原因是容易引发NPE,且无法在编译时期发现。
  • 构造器注入因其在单元测试和不可变性方面的优势,被视为最佳实践。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Facebook Dating:社交平台的约会新体验
  • 专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。
  • docker部署Guacamole手册
  • SpringBoot应用从jar包部署改为war包部署要做哪些修改
  • SpringCloud---服务注册(Eureka)
  • Ubuntu 24.04 LTS 桌面安装MT4或MT5 (MetaTrader)教程
  • JAVA的接口和实现类
  • Power Shell查看进程、排序、打印出前五
  • 【软考】UML中的关联关系
  • 低功率范围内的MOSFET表征
  • Mysql数据库的索引、事务和存储引擎
  • 面试题:Java中堆内存和栈内存的区别,缓存数据是把数据放到哪里
  • unittest框架和pytest框架区别及示例
  • js修改hash的方法
  • Lucene 索引文件详解:结构与工作原理
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • CSS 提示工具(Tooltip)
  • css系列之关于字体的事
  • CSS中外联样式表代表的含义
  • Java|序列化异常StreamCorruptedException的解决方法
  • JWT究竟是什么呢?
  • mysql_config not found
  • Promise初体验
  • python3 使用 asyncio 代替线程
  • Redux 中间件分析
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Sublime Text 2/3 绑定Eclipse快捷键
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从零开始的无人驾驶 1
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 实战|智能家居行业移动应用性能分析
  • 优化 Vue 项目编译文件大小
  • 【云吞铺子】性能抖动剖析(二)
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • # 职场生活之道:善于团结
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $nextTick的使用场景介绍
  • (1)无线电失控保护(二)
  • (10)ATF MMU转换表
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (第27天)Oracle 数据泵转换分区表
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)原生js案例之数码时钟计时
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (三)终结任务
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)树状数组