使用具有相似依赖关系的两个不同模块创建guice注入器

时间:2016-12-05 13:26:59

标签: java dependency-injection guice

假设我有两个模块ModuleAModuleB,它们是自给自足的,可以用作独立模块。这两个模块都依赖于第三个模块ModuleC,如

install(new ModuleC());

现在,我有一个用例,我需要创建一个包含A和B模块的注入器。我这样做了:

Guice.createInjector(new ModuleA(), new ModuleB());

它按预期抛出CreationException,表示已在其中一个模块上配置了对某个类的绑定。请记住,我没有权力改变ModuleAModuleB,我该如何让它发挥作用?

我尝试使用Modules.combine(Modules... modules),但这并没有解决我的问题。那有什么解决方案吗?

1 个答案:

答案 0 :(得分:4)

考虑您定义了以下绑定:

<强> ModuleC

  • C1

<强> ModuleA

  • A1
  • A2

<强> ModuleB

  • B1
  • B2

现在当你Guice.createInjector(new ModuleA(),new ModuleB())Modules.combine(..)时, 你的最终绑定列表将是:

  • A1
  • A2
  • B1
  • B2
  • C1(继承自A)
  • C1(!)(继承自B)

因为C1绑定被列出两次,会产生冲突并导致CreationException。

但是如果你使用Modules.override()代替:

  

返回一个构建器,该构建器创建一个覆盖给定模块上覆盖模块的模块。如果在两组模块中绑定了一个键,则只保留覆盖模块的绑定

E.g。通过做

Modules.override(new ModuleA()).with(new ModuleB()

您的最终绑定列表如下:

  • A1
  • A2
  • B1
  • B2
  • C1(继承自A)
  • C1(继承自B)
继承自 ModuleA 的C1绑定将被删除,以支持 ModuleB 中定义的C1绑定,从而解决冲突。