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

Java 使用具有相似依赖关系的两个不同模块创建guice注入器,java,dependency-injection,guice,Java,Dependency Injection,Guice,假设我有两个模块ModuleA和ModuleB,它们是自给自足的,可以用作独立模块。这两个模块都依赖于第三个模块ModuleClike install(new ModuleC()); 现在,我有一个用例,需要创建一个同时包含模块a和模块B的喷油器。我这样做了: Guice.createInjector(new ModuleA(), new ModuleB()); 它按预期抛出了一个CreationException,表示在其中一个模块上已经配置了与某个类的绑定。请记住,我无权更改Module

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

install(new ModuleC());
现在,我有一个用例,需要创建一个同时包含模块a和模块B的喷油器。我这样做了:

Guice.createInjector(new ModuleA(), new ModuleB());
它按预期抛出了一个
CreationException
,表示在其中一个模块上已经配置了与某个类的绑定。请记住,我无权更改
ModuleA
ModuleB
,如何使其工作


我尝试使用
模块。组合(模块…模块)
但这并没有解决我的问题。有什么解决方案吗?

请考虑定义了以下绑定:

模块化

  • C1
模块a

  • A1
  • A2
模块B

  • B1
  • B2
现在,当您执行
Guice.createInjector(新模块a(),新模块b())
Modules.combine(…)
,时, 您的最终绑定列表将是:

  • A1
  • A2
  • B1
  • B2
  • C1(从A继承而来)
  • C1(!)(从B继承)
由于C1绑定被列出两次,因此会产生冲突并导致
CreationException

但如果您使用:

返回一个生成器,该生成器创建一个模块,该模块将覆盖指定模块上的模块。如果在两组模块中都绑定了密钥,则只保留来自覆盖模块的绑定

例如通过做某事

Modules.override(new ModuleA()).with(new ModuleB())
您的最终绑定列表如下所示:

  • A1
  • A2
  • B1
  • B2
  • C1(从A继承而来)
  • C1(继承自B)

继承自模块a的C1绑定将被删除,以支持模块b中定义的C1绑定,从而解决冲突。

我尝试了
Guice.createInjector(Modules.override(new ModuleA(),new ModuleB())。with(new ModuleC())这起作用了
Guice.createInjector(Modules.override(new ModuleA())。with(new ModuleB())
。谢谢。但是你能详细说明一下你的答案吗?