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

@Autowire、@Recourse用啥?

        在使用IDEA写Spring相关的项目的时候,在字段上使用@Autowired注解时,总是会有一个波浪线提示:Field injection is not recommended. 这是为啥呢?今天就来一探究竟。

众所周知,在Spring里面有三种可选的注入方式:构造器注入、Setter方法注入、Field注入,我们先来看下这三种注入方式的使用场景。

构造器注入

构造器注入是通过调用类的构造方法来实现依赖注入。在类中定义一个或多个构造方法,并在构造方法中接受依赖对象作为参数。Spring 容器会根据参数类型和名称自动查找并初始化这些依赖对象。构造器注入通常用于强制依赖项,并且可以使类的实例在创建时就具有完整的状态。

public class MyClass {private MyDependency dependency;public MyClass(MyDependency dependency) {this.dependency = dependency;}
}

Setter方法注入

Setter 方法注入是通过设置类的属性的 Setter 方法来实现依赖注入。在类中定义一个或多个 Setter 方法,并在方法中接受依赖对象作为参数。Spring 容器会自动调用这些 Setter 方法,并传递相应的依赖对象。Setter 方法注入通常用于可选依赖项,并且可以在对象创建后随时更改依赖对象的值。

public class MyClass {private MyDependency dependency;public void setDependency(MyDependency dependency) {this.dependency = dependency;}
}

Field注入

字段注入是通过直接设置类的字段来实现依赖注入。在类中定义一个或多个私有字段,并使用 @Autowired 或 @Resource 注解进行标记。Spring 容器会在对象实例化完成之后,自动将相应的依赖对象注入到这些字段中。字段注入通常用于简单的依赖项,并且可以提供更简洁的代码。

public class MyClass {@Autowiredprivate MyDependency dependency;
}

为什么IDEA不推荐使用Field注入

  1. 代码的可读性差:使用字段注入时,依赖关系通常直接体现在类的字段上,而不是在构造函数或方法参数中。这使得代码更难以阅读和理解,特别是当类中存在多个字段注入时。

  2. 难以进行单元测试:字段注入使得在执行单元测试时很难对依赖进行模拟或替换。由于依赖关系直接在字段上声明,并且没有 setter 方法,无法方便地将模拟的依赖注入到测试中。

  3. 高耦合性:字段注入增加了类与依赖之间的紧密耦合。当类对某个依赖有强依赖关系时,无法在不修改类定义的情况下更改依赖对象。

        相比之下,构造函数注入(Constructor Injection)是一种更好的依赖注入方式。通过构造函数注入,依赖关系在类的构造函数中显式传递,使代码更易读、可维护和可测试。此外,构造函数注入还鼓励类定义依赖的完整性,并确保它们在对象创建时是必需的。

        虽然 IntelliJ IDEA 不推荐使用字段注入,但这并不意味着你不能使用它。在某些情况下,字段注入可能是合理的选择。然而,如果可能的话,建议优先考虑使用构造函数注入或方法参数注入,以提高代码的可读性、可测试性和扩展性。

        在Spring中使用依赖注入时,首选构造方法注入,虽然其无法解决循环依赖问题,但是当出现循环依赖时,首选应该考虑的是是否代码结构设计出现问题了,当然,也不排除必须要循环依赖的场景,此时字段注入也有用武之地。        

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

相关文章:

@Autowire、@Recourse用啥?

在使用IDEA写Spring相关的项目的时候,在字段上使用Autowired注解时,总是会有一个波浪线提示:Field injection is not recommended. 这是为啥呢?今天就来一探究竟。 众所周知,在Spring里面有三种可选的注入方式&#xf…...

[linux] 过滤警告⚠️

如果你在Python脚本中输出和执行脚本文件时想要过滤掉警告信息,可以尝试以下方法: 使用warnings模块:导入warnings模块并设置warnings.filterwarnings("ignore"),这将会忽略所有的警告信息。在需要过滤警告的部分之前添…...

Linux必备操作系统命令大全

一、基础命令 pwd 命令 pwd命令用于显示当前所在的工作目录的全路径名称。该命令无需任何参数,只需在终端窗口中输入 pwd 命令即可使用。 cd 命令 cd命令用于更改当前工作目录。该命令需要一个参数:目标目录名称。例如,若要进入 Document…...

【rtp】VideoTimingExtension 扩展的解析和写入

VideoTimingExtension 扩展有13个字节,并非都是字符串类型 class VideoTimingExtension {public:using value_type = VideoSendTiming;static constexpr RTPExtensionType kId = kRtpExtensionVideoTiming;static constexpr uint8_t kValueSizeBytes = 13...

网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你

目录 前言 一、内容简介 二、读者对象 三、专家推荐 四、全书目录 前言 CTF比赛是快速提升网络安全实战技能的重要途径,已成为各个行业选拔网络安全人才的通用方法。但是,本书作者在从事CTF培训的过程中,发现存在几个突出的问题&#xff1…...

Winform直接与Wpf交互

Winform项目中,可以直接使用wpf中的自定义控件和窗体 测试环境: vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下: 1 新建winfrom项目,名为WinFormDemo,默认有一个名为Form1的窗体…...

Uni-app 调用微信地图导航功能【有图】

前言 我们在使用uni-app时&#xff0c;有时候会遇到需要开发地图和导航的功能&#xff0c;这些方法其实微信小程序的API已经帮我们封装好了 详见&#xff1a;微信小程序开发文档 接下来我们就演示如何用uni-app来使用他们 使用 <template><view><button type…...

Golang slice 通过growslice调用nextslicecap计算扩容

先来看一段代码 code: e : []int64{1, 2, 3}fmt.Println("cap of e before:", cap(e))e append(e, 4, 5, 6, 7)fmt.Println("cap of e after:", cap(e))output:cap of e before: 3 cap of e after: 8 为什么容量是8&#xff1f; append了的4个元素&…...

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上Last-Modified属性&#xff08;表示这个资源在服务器上的最后修改时间&#xff09;&#xff1a; ----------------------------------------------------------------…...

零基础教程:Yolov5模型改进-添加13种注意力机制

1.准备工作 先给出13种注意力机制的下载地址&#xff1a; https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例&#xff08;不需要接收通道数的注意力机制&#xff09; 1.在models文件下新建py文件&#xff0c;取名叫Sim…...

vue截取地址参数

const getQueryValueFn () >{// 获取当前页面的URLconst currentURL window.location.href;//创建一个URL对象来解析当前URL。URL对象提供了方便的属性和方法来处理URL的各个部分const url new URL(currentURL);// 使用URLSearchParams获取查询参数const queryParams ne…...

ubuntu 14.04更新GCC版本

按最基本的apt-get install gcc-8&#xff0c;不成功&#xff0c;提示如下。 按网上说的&#xff1a;apt-get update ,apt-get upgrade 后都无效果。 apt-cache search get 搜索后&#xff0c;发现资源链接里最新的也只有4.8.4所以不行。 需要更新资源链接&#xff0c;镜像地…...

AndroidUtil - 强大易用的安卓工具类库

官网 https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md 项目介绍 AndroidUtilCode &#x1f525; 是一个强大易用的安卓工具类库&#xff0c;它合理地封装了安卓开发中常用的函数&#xff0c;具有完善的 Demo 和单元测试&#xff0c;利用其封装好的 API…...

[多态设计模式]枚举

背景&#xff1a; 游戏服务器中&#xff0c;多态可以说体现的淋漓尽致。 如&#xff1a; 1.开启条件。有的系统是根据玩家等级&#xff0c;有的是根据通关第几关。 2.商店可能有不同类型的商店。 3.任务系统中&#xff0c;不同的计数类型&#xff0c;不同的任务目标类型。…...

【QT】QRadioButton的使用(17)

QRadioButton这个控件在实际项目中多用于多个QRadioButton控件选择其中一个这样的方式去执行&#xff0c;那么&#xff0c;今天这节就通过几个简单的例子来好好了解下QRadioButton的一个使用。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&#xff1a;Download Pyt…...

力扣:105. 从前序与中序遍历序列构造二叉树(Python3)

题目&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&am…...

【含java2023面试题】HashMap、HashTable、ConcurrentHashMap

作为Java中最常用的Map集合&#xff0c;HashMap、HashTable和ConcurrentHashMap都是线程安全的&#xff0c;但它们之间有什么区别呢&#xff1f;在本文中&#xff0c;我们将深入探讨这三种Map集合的区别&#xff0c;并通过Java代码示例来演示它们之间的差异。 AI绘画关于SD,MJ…...

AT24C02芯片

AT24C02简介&#xff1a; AT24C01/02/04/08/16...是一个 1K/2K/4K/8K/16K 位串行 CMOS内部有9个字节&#xff1b; 该器件通过 I2C 总线接口进行 操作&#xff0c;它有一个专门的写保护功能&#xff1b; 基于51 他有这个芯片操作 时序&#xff1a; AT24C02软件编程&#xff1a; …...

Python+Django前后端分离

程序示例精选 PythonDjango前后端分离 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango前后端分离》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…...

win11系统固定到快速访问的文件夹无法调整顺序的问题

最近在使用win11系统时&#xff0c;固定到快速访问的文件夹无法调整顺序。网上搜了一大圈没有对应的解决方法&#xff0c;柳暗花明&#xff0c;在博主yin0hao的一篇文章中找到了类似的&#xff0c;跟着做了一下&#xff0c;结果问题也解决了。在此记录。 在文件资源管理器地址…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...