![]() |
1
15
好, 创建一个新的对象是尽可能明确的-您可以创建一个所需类的新实例。 依赖注入是一种机制,在需要的地方为您提供引用。 假设一个类表示到数据库的连接池-您通常只有该类的一个实例。现在,您需要将该引用分发给所有使用它的类。 这就是依赖注入的用武之地——通过使用诸如Spring这样的DI框架,您可以定义将池的一个实例注入到需要它的类中。 您的问题本身不容易回答,因为对象和依赖注入的创建不能那么容易地进行比较… |
![]() |
2
17
嗯,它们不完全可比。您总是需要通过在某个时刻实例化一个类来创建一个新的对象。依赖项注入还需要创建新对象。 当您想要控制或验证您所使用或想要测试的类所使用的实例的行为时,依赖性注入真正起作用。(对于测试驱动的开发依赖注入是除最小示例之外的任何示例的关键)。 假设类持有者需要类句柄的对象。传统的做法是让holder实例创建并拥有它:
holder实例创建myhandle,类之外的任何人都无法访问它。在某些情况下,UnitTesting在其中,这是一个问题,因为在不创建句柄实例的情况下无法测试holder类,而句柄实例又可能依赖于许多其他类和实例。这使得测试变得笨拙和繁琐。 例如,通过在构造函数中插入句柄实例,来自外部的人将负责创建实例。
正如您所看到的,代码几乎是相同的,句柄仍然是私有的,但是holder类现在与它的外部世界有一个非常失败的耦合,这使得许多事情变得简单。在测试holder类时,可以注入一个模拟对象或存根对象,而不是一个真实的实例,从而可以验证或控制holder、其调用方和句柄之间的交互。 实际的注入会发生在其他地方,通常是一些“主要”程序。有多个框架可以帮助您在不编程的情况下实现这一点,但本质上这是“主”程序中的代码:
本质上,注射只是一种幻想
|
![]() |
3
15
当然,两者都会创建对象。区别在于谁负责创作。它是需要依赖项的类,还是像Spring这样连接组件依赖项的容器。在单独的(通常是XML)配置文件中配置依赖项。 这真的是一种分心。这个类说我需要这个,这个和这个组件,所以我可以正常工作。这个类不关心它如何获取组件。您可以使用单独的配置文件将它们插入类中。 为了给你一个例子,让我们考虑拥有一个需要支付模块的购物类。您不想硬编码将使用哪个支付模块。要实现这一点,请反转控件。您可以在容器的配置文件中按几下键来更改已使用的支付模块。它的力量在于你不接触任何Java代码。 |
![]() |
4
2
当使用反转控制容器执行依赖项注入时,容器创建对象,而不是开发人员。这样做是为了容器可以将这些对象“注入”到其他对象中。 我建议您阅读一些关于依赖注入和/或Spring的文章。或者阅读其他关于依赖注入的主题。 |
![]() |
5
2
依赖注入为应用程序添加了一层可配置性。在这个意义上,当您硬编码对象构造时,需要重新构建和重新部署应用程序,但是当使用依赖性注入时,可以重新配置XML并改变行为,而不必重新构建和重新部署。有很多不同的用例,在这些用例中,这可以节省大量的联系和工作量。 |