@Autowire、@Recourse用啥?

2023-09-20 23:10:41

        在使用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 {
    @Autowired
    private MyDependency dependency;
}

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

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

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

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

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

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

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

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

更多推荐

Vue3通透教程【十七】Vite构建TS版本Vue项目

文章目录🌟写在前面🌟创建TS版本的Vue3项目🌟插件安装🌟写在最后🌟写在前面专栏介绍:凉哥作为Vue的忠实粉丝输出过大量的Vue文章,应粉丝要求开始更新Vue3的相关技术文章,Vue框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是Vue框架之所以火起来的

高压配电安全监测系统:确保电力系统的稳定运行

随着现代社会对电力需求的不断增长,高压配电系统的重要性日益凸显。为了保证电力系统的稳定运行,提高供电质量,采用高压配电安全监测系统至关重要。力安科技高压配电安全监测系统通过在每面高压柜(进线柜、出线柜、联络柜)配置一只A62系列电力探测器,在断路器的进出铜排接线处各安装一只无线测温探测器,并加装开口电流互感器一套,经G

异步机制的简单实现

计算机有两种阻塞,一是cpu阻塞,二是io阻塞。cpu阻塞就是cpu密集计算,io阻塞比如等待网络响应,等待磁盘响应,纯粹是浪费时间。线程机制和异步机制都可避免io阻塞,但cpu阻塞的负面效果就只有线程可以避免了。在现代计算机语言里,大量线程切换虽然会有性能问题,但是线程用起来简单,而且线程能在固定时间切换,可保证实时

Typora mac新手入门教程

ypora是一款由AbnerLee创造的Markdown编辑器,它具备轻巧的特性。与其他Markdown编辑器有所不同的是,Typora不采用传统的源代码和预览分栏显示方式,而是提供了一种所见即所得的编辑方式,允许用户即时预览文档渲染效果,同时也提供了源代码编辑模式的切换功能。以下是一个在macOS下入门使用Typor

PG-多版本并发控制

多版本并发控制(Multi-VersionConcurrencyControl,MVCC),是数据库中并发访问数据时保证数据一致性的一种方法1.原理1)在并发操作中,当正在写时,如果有用户在读,这时写可能只写了一半,如一行的前半部分刚写入,后半部分还没有写入,这时可能读的用户读取到的数据行的前半部分数据是新的,后半部分

聚焦数据库和新兴硬件的技术合力 中科驭数受邀分享基于DPU的数据库异构加速方案

随着新型硬件成本逐渐降低,充分利用新兴硬件资源提升数据库性能是未来数据库发展的重要方向之一,SIGMOD、VLDB、CICE数据库顶会上出现越来越多新兴硬件的论文和专题。在需求侧,随着数据量暴增和实时性的要求越来越高,数据库围绕处理器、内存、存储和网络四个硬件架构方向不断突破和创新。数据库和新兴硬件之间的融合产生了令人

机器学习中分类问题的初步

分类任务做人脸辨识也可以是分类,手写字识别也可以是用回归来预测分类,因为回归会惩罚那些太正确的分类,反而得到的结果是不好的,还有一个问题如果你把class1当作1,class2当作2,class3当3,这样做就相当于默认了class12相近二元分类的任务的步骤类别的个数的概率水系中某一个品种的概率如果找到了高斯分布就可

JavaScript学习笔记04

JavaScript笔记04方法定义方法当一个函数是一个对象的属性时,称之为方法。例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><script>letperson={name:"张三",birthday:200

JavaScript之观察者模式

本文作者为360奇舞团前端开发工程师概述在日常开发中,开发人员经常使用设计模式来解决软件设计中的问题。其中,观察者模式是一种常用的模式,它可以帮助开发人员更好地处理对象之间的通信。在JavaScript中,观察者模式的应用非常广泛,可以用于实现事件处理、数据绑定等功能。本文将介绍观察者模式的基本概念和实现方式。什么是观

大数据之Hadoop

大数据按顺序给出数据存储单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。1Byte=8bit1K=1024Byte1MB=1024K1G=1024M1T=1024G1P=1024THadoopHadoop是一个能够对大量数据进行分布式处理的软件框架。分布式处理是指:比如有100

苹果CMS主题 MXonePro二开优化修复开源版影视网站源码

MXPro模板主题(又名:mxonepro)是一款基于苹果cms程序的一款全新的简洁好看UI的影视站模板类似于西瓜视频,不过同对比MxoneV10魔改模板来说功能没有那么多,也没有那么大气,但是比较且可视化功能较多简洁且有周更记录样式等多功能后台设置,类似预mxone魔改版的预告片功能,用来做影视站模板也是极好的,但之

热文推荐