Guice:何时在无头JAR中开始注射/自举?

时间:2012-03-07 17:53:11

标签: java dependency-injection jar guice

所以我正在编写一堆组件(将打包为JAR),并且他们都在使用Guice for DI。这些组件只是可重用的,“公共”类型的JAR将被其他下游项目使用。

我对Guice的理解是你实现了一个具体的Module并使用它来将对象绑定在一起,实际上,配置你所有的DI。我的理解是,您应该在一个“bootstrapping”阶段创建Guice注入器,然后使用injector.getInstance(SomeClass.class)从该注入器获取模块配置的所有依赖项。

这在独立应用程序中很有用,它有一些入口点,你可以调用一个init()样式的方法来引导Guice,但是在一个没有入口点的无头JAR中,我是努力确定何时/何地/如何引导Guice。

这些将是生活在类路径上的JAR,并且在任何时间点,外部实体都可以调用和分类以及它们内部的任何方法。我考虑过使用“延迟初始化”设置,其中一个方法检查是否已经配置了它的依赖项,如果是,则启动一个bootstrap方法。

但这是一个非常可怕的解决方案!部分原因是因为这需要每个类都有自己的Module(这很荒谬),并且它还会使用与DI相关的代码污染我的整个代码库。

我在这里显然缺少一些Guice基础知识,否则我看不出Guice如何用于除了从开始到结束执行的应用程序已知和控制的应用程序之外的任何其他内容。任何代码示例都是一个巨大的优势!提前谢谢。

1 个答案:

答案 0 :(得分:5)

如果其他代码想要在没有的情况下使用Guice配置您的类,它应该能够。但是,您应该提供一个Guice模块,它以合理的方式绑定所有内容,以便其他代码(可能是其他模块)可以安装您的模块,然后将依赖项注入到自己的类中。

当然,您根本不需要自己公开模块 - 您可以将其留给其他人来执行所有绑定。但是,您可能希望提供一个模块以避免暴露您的实现细节 - 您可以公开公共接口和公共模块,但随后保持实现包 - 私有。模块可以将接口绑定到实现,而无需调用者了解它。

您可能还想调查私有模块,以便您可以绑定您的代码所需的依赖项,而不会更广泛地公开它们。

某些东西,某个地方必须创建一个注入器 - 但如果你的代码只是“库”代码,那么它几乎肯定不应该是你。你不应该自己进行注射 - 你应该让你的代码适合进行注射。