为什么Spring不建议使用基于字段的依赖注入

news2024/11/18 7:37:01
  • 在我们通过IDEA编写Spring的代码的时候,假如我们编写了如下代码:

  • IDEA会给我们一个warning警告:

  • 翻阅官方文档;我们会发现:

  • 大意就是强制依赖使用构造器注入,可选依赖使用setter注入
  • 那么这是为什么呢?使用字段注入又会导致什么问题呢?
  • 单一职责问题
  • 我们都知道,根据SOLID设计原则来讲,一个类的设计应该符合单一职责原则,就是一个类只能做一件功能,当我们使用基于字段注入的时候,随着业务的暴增,字段越来越多,我们是很难发现我们已经默默中违背了单一职责原则的
  • 但是如果我们使用基于构造器注入的方式,因为构造器注入的写法比较臃肿,所以它就在间接提醒我们,违背了单一职责原则,该做重构了

  • 可能产生NPE
  • 对于一个bean来说,它的初始化顺序为:
  • 静态变量或静态语句块 -> 实例变量或初始化语句块 -> 构造方法 -> @Autowired
  • 所以,在静态语句块,初始化语句块,构造方法中使用Autowired表明的字段,都会引起NPE问题

  • 相反,用构造器的DI,就会实例化对象在使用的过程中,字段一定不为空
  • 隐藏依赖
  • 对于一个正常的使用依赖注入的Bean来说,它应该“显式”的通知容器,自己需要哪些Bean,可以通过构造器通知,public的setter方法通知,这些设计都是没问题的
  • 但是对于private的filed来说,从设计的角度来讲,外部的容器是不应该感知到bean内部的private内容的,所以理论上,private的filed是没办法通知到容器的(不考虑反射,单从设计角度理解),所以从这个角度来看,我们不能通过字段注入
  • 不利于测试
  • 很明显,使用了Autowired注解,说明这个类依赖了Spring容器,这让我们在进行UT的时候必须要启动一个Spring容器才可以测试这个类,显然太麻烦,这种测试方式非常重,对于大型项目来说,往往启动一个容器就要好几分钟,这样非常耽误时间
  • 不过,如果使用构造器的依赖注入就不会有这种问题,或者,我们可以使用Resource注解也可以解决上述问题
  • Spring支持哪些注入方式
  • 1. 字段注入

  • 2. 构造器注入

  • 3. setter注入

  • 使用构造器注入可能有哪些问题
  • 如果我们两个bean循环依赖的话,构造器注入就会抛出异常:

  • 如果两个类彼此循环引用,那说明代码的设计一定是有问题的
  • 如果临时解决不了,我们可以在某一个构造器中加入@Lazy 注解,让一个类延迟初始化即可

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

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

相关文章

App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

【服务器】在 Linux CLI 下安装 Anaconda

【服务器】在 Linux CLI 下安装 Anaconda 1 系统环境2 下载安装包3 安装 1 系统环境 查看系统信息 cat /etc/os-release2. 查看架构 uname -a # output # Linux localhost.localdomain 4.18.0-193.28.1.el8_2.x86_64 #1 SMP Thu Oct 22 00:20:22 UTC 2020 x86_64 x86_64 x86…

4.Tensors For Beginners-Vector Definition

在上一节,已经了解了前向和后向转换。 什么是向量? 定义1:向量是一个数字列表 这很简洁,也通俗易懂。 现有两个向量: 如果要把这两个向量给加起来,只需把对应位置的元素(组件)给加起来。 而要缩放向量&…

angularjs开发环境搭建

Angularjs是一个前端页面应用开发框架,其使用TypeScript作为开发语言,Angularjs的特性包括,使用组件、模板以及依赖注入的开发框架构建可扩展的web应用,使用易于集成的类库支持页面路由、页面表单、前后端接口交互等各种不同特性&…

MySQL5.7版本与8.0版本在CentOS系统安装

目录 前置要求 1. MySQL5.7版本在CentOS系统安装 1.1 安装 1.1.1 配置yum仓库 1.1.2 使用yum安装MySQL 1.1.3 安装完成后,启动MySQL并配置开机自启动 1.1.4 检查MySQL的运行状态 1.2 配置 1.2.1 获取MySQL的初始密码 1.2.2 登陆MySQL数据库系统 …

Python爬取诗词名句网中三国演义的乱码问题

一、乱码问题 为解决中文乱码问题,可使用chardet.detect()检测文本编码格式 详细: Python爬虫解决中文乱码_脑子不好真君的博客-CSDN博客 二、代码 #爬取三国演义 import requests import chardet from bs4 import BeautifulSoupurlhttps://www.shicim…

【Vue3】自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令 (Custom Directives)。 1. 生命周期钩子函数 一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。 在 <script …

多通道反向字典模型

方法 将单词的definition embedding输入Bi-LSTM模型&#xff0c;经过处理得到5个分数并加权求和得到最终的置信分数 最后对分数向量进行降序排序&#xff0c;得到word rank 代码实现&#xff1a; _, indices torch.sort(score, descendingTrue) 辅助信息 这是AAAI 2020的论…

【多模态融合】TransFusion学习笔记(1)

工作上主要还是以纯lidar的算法开发,部署以及系统架构设计为主。对于多模态融合(这里主要是只指Lidar和Camer的融合)这方面研究甚少。最近借助和朋友们讨论论文的契机接触了一下这方面的知识&#xff0c;起步是晚了一点&#xff0c;但好歹是开了个头。下面就借助TransFusion论文…

Scapy样例三则

1. 演示ls()/lsc()用法: ##Exec1.pyfrom scapy.all import *## 列出scapy支持的命令 def ListScapyCmd():lsc()## 列出指定协议的各个字段, 用于构成packet def ListProtocolField(protoclName):ls(protoclName)if __name__ "__main__":print("\nexample of …

【项目开发 | C语言项目 | C语言薪资管理系统】

本项目是一个简单的薪资管理系统&#xff0c;旨在为用户提供方便的员工薪资管理功能&#xff0c;如添加、查询、修改、删除员工薪资信息等。系统通过命令行交互界面与用户进行交互&#xff0c;并使用 txt 文件存储员工数据。 一&#xff0c;开发环境需求 操作系统&#xff1a;w…

网站安全防护措施

网络安全的重要性在网站和app的发展下已经被带到了全新的高度&#xff0c;已然成为各大运维人员工作里不可或缺的环节&#xff0c;重视网络安全能给我们的网站带来更好的口碑&#xff0c;也能为企业生产创造更稳定的环境。下面我们一起来看看有哪些是我们运维人员能够做的。 1、…

图片批量处理:轻松实现图片批量处理:按需缩放图片像素

在日常生活和工作中&#xff0c;我们经常需要处理大量的图片。有时候&#xff0c;我们需要对图片进行一些调整&#xff0c;以满足特定的需求。其中&#xff0c;缩放图片像素是一项非常常见的操作。但是&#xff0c;一张一张地处理图片不仅费时&#xff0c;还容易出错。幸运的是…

前端笔试题总结,带答案和解析(二)

前端笔试题总结&#xff0c;带答案和解析&#xff08;二&#xff09; 上一期&#xff1a; 前端笔试题总结&#xff0c;带答案和解析&#xff08;1&#xff09; 11.以下代码的执行后&#xff0c;str 的值是&#xff1a; var str "Hellllo world"; str str.replac…

vertx学习总结5

这章我们讲回调&#xff0c;英文名&#xff1a;Beyond callbacks 一、章节覆盖&#xff1a; 回调函数及其限制&#xff0c;如网关/边缘服务示例所示 未来和承诺——链接异步操作的简单模型 响应式扩展——一个更强大的模型&#xff0c;特别适合组合异步事件流 Kotlin协程——…

408-2013

一、单项选择题&#xff08;2分/题&#xff09; 1.已知两个长度分别为 m 和 n 的升序链表&#xff0c;若将他们合并为一个长度为 mn 的降序链表&#xff0c;则最坏情况下的时间复杂度为______。 A.O(n) B.O(mn) C.O(min(m,n)) D.O(max(m,n)) 解答&#xf…

【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 LCR 090. 打家劫舍 II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Android---GC回收机制与分代回收策略

目录 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾回收算法 JVM 分代回收策略 1. 新生代 2. 老年代 GC Log 分析 引用 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾就是内存中已经没有用的对象&#xff0c;JVM 中的垃圾回收器(Garbage Collector)会自…

【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)

一、声明 只实现物理反弹的效果&#xff0c;不实现蹦床会有的视觉拉伸效果&#xff0c;请自行找相关代码 二、实现 经过我的实践&#xff0c;我发现要想实现一个平台反弹的效果&#xff0c;要么就选择给player添加一个物理材质&#xff08;平台加了没用&#xff09;&#xff0…

【网络】网络扫盲篇 ——用简单语言和图解带你入门网络

网络的一些名词和基础知识讲解 前言正式开始一些基础知识发展背景运营商和生产商 协议协议的分层TCP/IP五层(或四层)模型&#xff08;可以不看&#xff0c;对新手来说太痛苦了&#xff0c;我这里只是为了让屏幕前的你过一遍就好&#xff0c;里面很多概念新手是不太懂的&#xf…