首页 归档 关于 learn love 工具

依赖注入

简介

在软件工程中,依赖注入(dependency injection)的意思为,给予调用方它所需要的事物。“依赖”是指可被方法调用的事物。依赖注入形式下,调用方不再直接指使用“依赖”,取而代之是“注入” 。“注入”是指将“依赖”传递给调用方的过程。在“注入”之后,调用方才会调用该“依赖”。传递依赖给调用方,而不是让让调用方直接获得依赖,这个是该设计的根本需求。在编程语言角度下,“调用方”为对象和类,“依赖”为变量。在提供服务的角度下,“调用方”为客户端,“依赖”为服务。

在理解它在编程中的含义之前,首先让我们了解一下它的总体含义,这可以帮助我们更好地理解这个概念。

依赖是指依靠某种东西来获得支持。比如我会说我们对手机的依赖程度过高。

在讨论依赖注入之前,我们先理解编程中的依赖是什么意思。

当 class A 使用 class B 的某些功能时,则表示 class A 具有 class B 依赖。

在 Java 中,在使用其他 class 的方法之前,我们首先需要创建那个 class 的对象(即 class A 需要创建一个 class B 实例)。

因此,将创建对象的任务转移给其他 class,并直接使用依赖项的过程,被称为“依赖项注入”。

为什么需要使用依赖注入

假设我们有一个 car class,其中包含各种对象,例如车轮、引擎等。

这里的 car class 负责创建所有依赖对象。现在,如果我们决定将来放弃 MRFWheels,而希望使用 Yokohama 车轮,该怎么办?

我们将需要使用新的 Yokohama 依赖关系来重新创建 car 对象。但是,当使用依赖注入(DI)时,我们可以在运行时更改车轮 wheels(因为可以在运行时而不是在编译时注入依赖项)。

你可以将依赖注入视为代码中的中间人,它负责创建想要的 wheels 对象,并将其提供给car class。

它使 car class 不需要创建车轮 wheels、电池 battery 对象等。

三种类型的依赖注入

  • 构造函数注入:依赖关系是通过 class 构造器提供的。
  • setter 注入:注入程序用客户端的 setter 方法注入依赖项。
  • 接口注入:依赖项提供了一个注入方法,该方法将把依赖项注入到传递给它的任何客户端中。客户端必须实现一个接口,该接口的 setter 方法接收依赖。

如果对象有任何更改,则依赖注入会对其进行调查,并且不应影响到使用这些对象的类。这样,如果将来对象发生变化,则依赖注入负责为类提供正确的对象。

控制反转——依赖注入背后的概念

这是指一个类不应静态配置其依赖项,而应由其他一些类从外部进行配置。

这是 S.O.L.I.D 的第五项原则——一类应该依赖于抽象,而不是依赖于具体的东西(简单地说,就是硬编码)。

根据这些原则,一个类应该专注于履行其职责,而不是创建履行这些职责所需的对象。 这就是依赖注入发挥作用的地方:它为类提供了必需的对象。