【发布时间】:2015-02-11 20:34:47
【问题描述】:
我想减少两个组件之间的耦合,于是想到了dependency injection,但是长期以来,我只是用Spring来实现这个。但是现在,我正在做一个不适合使用这个框架的项目(它太重了)。
那么你能给我一个例子来为我自己实现dependency injection吗?
【问题讨论】:
标签: java spring dependency-injection inversion-of-control
我想减少两个组件之间的耦合,于是想到了dependency injection,但是长期以来,我只是用Spring来实现这个。但是现在,我正在做一个不适合使用这个框架的项目(它太重了)。
那么你能给我一个例子来为我自己实现dependency injection吗?
【问题讨论】:
标签: java spring dependency-injection inversion-of-control
Dependency Injection 是一种无需框架支持即可轻松使用的模式。有些人甚至更喜欢没有框架支持的框架,但至少,框架是否真的有用取决于way you use such framework 以及您正在构建/维护的应用程序的类型和大小。
依赖注入只是将依赖项从外部注入到组件中。最常见和建议的方法是通过构造函数注入。这意味着一个类应该将其所有依赖项指定为构造函数参数。
您应该始终设计您的代码,就好像根本没有 DI 框架一样;您的应用程序代码应该忽略此类框架的存在。这意味着您永远不应该使用特定于框架的属性来装饰您的代码。它们会污染您的代码并导致供应商锁定。如果您使用的 DI 库需要使用属性,请切换到其他库。
依赖注入的使用会在整个应用程序中“冒泡”。这意味着应用依赖注入模式的类将把创建其依赖的责任移到调用堆栈上。这意味着该类的使用者现在负责创建其依赖项。但是由于该消费者也应该应用依赖注入,这意味着它再次推动了创建依赖关系的责任。当所有类都应用依赖注入模式时,这意味着需要在应用程序的一个地方创建完整的对象图。这实际上是一件好事。这个地方叫做composition root。
同样,您不需要使用 DI 库(也称为 IoC 容器),您的应用程序代码绝对不应该依赖它。您应该应用依赖注入模式(和 SOLID 原则)以使您的应用程序可维护。 DI 库可用于使您的组合根可维护,但只有在它使组合根更易于维护时才应使用它。不使用 DI 库可以在创建对象图时为您提供完整的编译时支持。使用 DI 库将使您失去这种编译时支持,因此使用它的优点应该超过失去编译时支持的缺点。此外,您需要确保可以在应用程序启动期间或至少在测试套件中验证对象图的构建。如果您的 DI 容器使这变得难以实现,那么切换库或手动构建对象图可能是更好的选择。
【讨论】:
为什么要重新发明轮子? Java 具有出色的 CDI 框架。它轻巧且易于使用。欲了解更多信息,请参阅http://docs.oracle.com/javaee/6/tutorial/doc/giwhl.html
【讨论】: