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

  • 在我们通过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.rhkb.cn/news/147992.html

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

相关文章

一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案

前言 如今进行入自媒体行业的人越来越多,短视频也逐渐成为了主流,但好多时候是想如何把视频里面的语音转成文字,比如,录制会议视频后,做会议纪要;比如,网课教程视频,想要做笔记&…

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

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

fcpx插件:82种复古电影胶卷框架和效果mFilm Matte

无论您是在制作音乐剪辑、私人假期视频还是大型广告活动,这个专业的插件都将帮助您为您的镜头赋予真正的电影角色。 复古效果在任何视频中都能立即识别出来,增添了感伤的复古氛围,并使镜头更具说服力。使用 mFilm Matte 轻松实现这些特征&…

C++算法 —— 动态规划(10)二维费用背包

文章目录 1、动规思路简介2、一和零3、盈利计划 背包问题需要读者先明白动态规划是什么,理解动规的思路,并不能给刚接触动规的人学习。所以最好是看了之前的动规博客,以及两个背包博客,或者你本人就已经懂得动规了。 1、动规思路简…

九、2023.10.3.Linux(end).9

文章目录 33、简述mmap的原理和使用场景?34、互斥量能不能在进程中使用?35、协程是轻量级线程,轻量级表现在哪里?36、说说常见信号有哪些,表示什么含义?37、说说线程间通信的方式有哪些?38、说说…

Access注入---Cookie注入

Access注入----Cookie注入Access数据库(微软) 逐渐淘汰 (没有库的概念,是表的集合)Access没有系统自带库Cookie注入(头注入HEAD注入的)php中产生Cookie注入的可能性小,但ASP产生Cook…

RabbitMQ的基本介绍

什么是MQ 本质是一个队列,只不过队列中存放的信息是message罢了,还是一种跨进程的通信机制,用于上下游传递信息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦物理解耦”的消息通信服务。使用了MQ之后,信息发送…

postgresql16-新特性

postgresql16-新特性 any_value数组抽样数组排序 any_value any_value 返回任意一个值 select e.department_id ,count(*), any_value(e.last_name) from cps.public.employees e group by e.department_id ;数组抽样 -- 从数组中随机抽取一个元素 array_sample(数组&#…

以太网基础学习(四)——IP协议

一 、IP协议概述 IP(Internet Protocol,互联网协议)是互联网通信的基础协议,它负责将数据包从源地址传输到目的地址。IP协议定义了如何封装数据包,如何寻址数据包以及如何路由数据包,它是随着互联网的出现而…

弧度、圆弧上的点、圆的半径(r)、弧长(s)之间的关系

要计算弧度和圆弧上的点,需要知道以下几个要素: 圆的半径(r):即圆的中心到圆周上任意一点的距离。 弧长(s):从圆周上的一个点到另一个点所经过的弧长。 弧度(θ&#x…

【CAD二次开发】给CAD添加TRUSTEDPATHS避免dll插件信任弹窗

找到配置文件目录,遍历下面的每个配置文件; 找到 Variables 下的TRUSTEDPATHS项目;在后面添加新的目录即可,多个目录使用分号分隔; public static void AddPath(string trusedPath){// 指定注册表键的路径

指针笔试题(带解析版)

题目2: struct MyStruct {int num;char* pcname;short sdate;char cha[2];short sba[4]; }*p; //结构体大小为32字节 //p0x100000 int main() {p 0x100000;printf("%p\n", p 0x1);//p:结构体指针,1下一个结构体指针,…

axb_2019_brop64

axb_2019_brop64 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)64位,只开了NX __int64 repeater() {size_t v1; // raxchar s[208]; // [rsp0h] [rbp-D0h] BYREFprintf("…

SLAM从入门到精通(用python实现机器人运动控制)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在ROS下面,开发的方法很多,可以是c,可以是python。大部分接口操作类的应用,其实都可以用python来开…

深度学习 图像分割 PSPNet 论文复现(训练 测试 可视化)

Table of Contents 一、PSPNet 介绍1、原理阐述2、论文解释3、网络模型 二、部署实现1、PASCAL VOC 20122、模型训练3、度量指标4、结果分析5、图像测试 一、PSPNet 介绍 PSPNet(Pyramid Scene Parsing Network)来自于CVPR2017的一篇文章,中文翻译为金字塔场景解析…

springboot+Uniapp+redis智能导诊系统源码,支持以公众号、小程序、App 等形式接入

AI医疗的智能导诊系统源码 智慧导诊系统全套源码 什么是智能导诊系统? 智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件,它能够通过对患者的症状、病史等信息进行计算分析,快速推荐科室和医生。通过简单的描述自身症状&#…

go语法入门2

字符串 使用双引号或反引号引起来的任意个字符。它是字面常量。 func main() {var a "abc\n测试" // \n换行fmt.Println(a) } abc 测试func main() {var a "abc\n\t测试" \\换行后在tabfmt.Println(a) } abc测试func main() {var a abc测试 …

火山引擎 ByteHouse 与白鲸开源完成兼容性认证,加速数据价值释放

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 数据作为新型生产要素,已快速融入生产、分配、流通、消费和社会服务管理等各环节,深刻改变着生产方式、生活方式和治理方式。越来越多企业也…

番外12:连续类功率放大器理论-连续类实现带宽拓展的底层原理

连续类功放通解:连续类功率放大器理论-连续类实现带宽拓展的底层原理-基础 本次内容理论性较强,适合对功率放大器理论研究比较感兴趣以及想发论文的小朋友,着重探讨现有的一些带宽拓展模式(也就是连续类)的基本实现原…

基于SpringBoot的流浪动物管理系

基于SpringBoot的流浪动物管理系的设计与实现,前后端分离 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首页 后台登陆界面 管理员界面 摘要 基于Spring Boot的…