创建新对象和依赖关系注入之间的区别

2022-09-01 12:29:00

创建新对象和依赖关系注入有什么区别?请详细解释。


答案 1

好吧,它们并不完全具有可比性。您将始终必须通过在某些时候实例化类来创建新对象。依赖关系注入还需要创建新对象。

当您想要控制或验证您使用或要测试的类所使用的实例的行为时,依赖关系注入真正发挥作用。(对于测试驱动开发,依赖注入是除最小示例之外的所有示例的关键)。

假设一个类 Holder 需要一个类 Handle 的对象。传统的方法是让 Holder 实例创建并拥有它:

class Holder {
    private Handle myHandle = new Handle();
    public void handleIt() {
        handle.handleIt();
    }
}

Holder 实例创建 myHandle,类外的任何人都无法使用它。在某些情况下,单元测试就是其中之一,这是一个问题,因为如果不创建 Handle 实例,就不可能测试 Holder 类,而 Handle 实例反过来又可能依赖于许多其他类和实例。这使得测试变得笨拙而繁琐。

通过注入 Handle 实例(例如在构造函数中),外部人员负责实例的创建。

class Holder {
    private Handle myHandle;

    public Holder(Handle injectedHandle) {
        myHandle = injectedHandle;
    }

    public void handleIt() {
        handle.handleIt();
    }
}

正如你所看到的,代码几乎是相同的,Handle仍然是私有的,但是Holder类现在与它的外部世界有一个失败者耦合,这使得许多事情变得更简单。在测试 Holder 类时,可以注入一个 mock 或 stub 对象,而不是一个真实实例,从而可以验证或控制 Holder、其调用方和句柄之间的交互。

实际的注射将在其他地方进行,通常是一些“主要”程序。有多个框架可以帮助您无需编程即可做到这一点,但本质上这是“main”程序中的代码:

...
private Handle myHandle = new Handle(); // Create the instance to inject
private Handler theHandler = new Handler(myHandle); // Inject the handle
...

从本质上讲,注射只不过是一种花哨的方法。当然,您可以使用它来实现注入机制,而不是像上面的简单示例那样在构造函数中实现。set


答案 2

当然,两者都创建对象。不同之处在于谁负责创作。它是需要其依赖项的类,还是像Spring这样的容器,它连接组件依赖项。您可以在单独的(通常是 XML)配置文件中配置依赖项。

这实际上是一种关注点的分离。班级说我需要这个,这个和这个组件,所以我可以正常工作。该类不关心它如何获取其组件。您可以使用单独的配置文件将它们插入到类中。

为了给您一个例子,让我们考虑一个需要支付模块的购物类。您不想对将使用哪个支付模块进行硬编码。为此,请反转控件。您可以通过在容器的配置文件中按几个键来更改使用的付款模块。强大的功能是你没有接触任何Java代码。