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

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

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

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

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

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

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

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

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

相关推荐
一直都在5726 分钟前
SpringBoot3 框架快速搭建与项目工程详解
java·开发语言
子云之风7 分钟前
LSPosed 项目编译问题解决方案
java·开发语言·python·学习·android studio
小北方城市网7 分钟前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
独自破碎E10 分钟前
什么是Spring IOC
java·spring·rpc
lendsomething14 分钟前
graalvm使用实战:在java中执行js脚本
java·开发语言·javascript·graalvm
烤麻辣烫14 分钟前
java进阶--刷题与详解-2
java·开发语言·学习·intellij-idea
期待のcode15 分钟前
性能监控工具
java·开发语言·jvm
Chan1622 分钟前
【 微服务SpringCloud | 方案设计 】
java·spring boot·微服务·云原生·架构·intellij-idea
小屁猪qAq24 分钟前
设计模式总纲
开发语言·c++·设计模式
不绝19130 分钟前
C#核心:多态
开发语言·c#