一尘不染

场注入到底是什么?如何避免?

spring-mvc

我在有关Spring MVC和Portlet的一些帖子中读到,不建议使用 字段注入 。据我了解, 字段注入
是当您使用以下方式注入Bean时@Autowired

@Component
public class MyComponent {
    @Autowired
    private Cart cart;
}

在研究期间,我还阅读了有关 构造函数注入的信息

@Component
public class MyComponent {
    private final Cart cart;

    @Autowired
    public MyComponent(Cart cart){
       this.cart = cart;
    }
}

这两种类型的注射都有哪些优点和缺点?


编辑1: 由于此问题被标记为该问题的重复,我检查了它。因为在问题和答案中都没有任何代码示例,所以我不确定我所使用的注入类型是否正确。


阅读 671

收藏
2020-06-01

共1个答案

一尘不染

注射类型

有三种方法可以将依赖项注入到bean中:

  1. 通过构造函数
  2. 通过二传手或其他方法
  3. 通过反射,直接进入田野

您正在使用选项3。这就是@Autowired直接在字段上使用时发生的情况。


注射指南

Spring建议的一般准则如下(请参阅有关基于构造函数的DI基于Setter的DI的部分):

  • 对于强制性依赖性或针对不变性,请使用构造函数注入
  • 对于可选或可变的依赖项,请使用setter注入
  • 大多数情况下避免现场注入

场注入的缺点

为何不赞成使用场注入技术,原因如下:

  • 您不能像构造函数注入那样创建不可变的对象
  • 您的课程与您的DI容器紧密耦合,不能在其外部使用
  • 没有反射就无法实例化您的类(例如在单元测试中)。您需要DI容器来实例化它们,这使您的测试更像集成测试
  • 您真正的依赖项从外部隐藏,并且没有反映在您的界面中(构造函数或方法)
  • 拥有十个依赖关系确实很容易。如果您使用构造函数注入,则将有一个带有十个参数的构造函数,这将表明某些东西很混乱。但是您可以无限期地使用字段注入来添加注入的字段。依赖关系过多是一个危险信号,即该类通常不仅仅做一件事,而且还可能违反“单一职责原则”。

结论

根据您的需求,您应该主要使用构造函数注入或构造函数和setter注入的某种混合。场注入具有许多缺点,应该避免。场注入的唯一优点是写起来更方便,但没有克服所有缺点。


进一步阅读

我写了一篇博客文章,介绍为什么通常不建议使用字段注入:字段依赖注入被认为有害

2020-06-01