【问题标题】:Creating a guice injector with two different modules having similar dependencies使用具有相似依赖关系的两个不同模块创建一个 guice 注入器
【发布时间】:2020-03-12 08:21:52
【问题描述】:

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

install(new ModuleC());

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

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

正如预期的那样,它抛出了CreationException,表示已在其中一个模块上配置了与某个类的绑定。请记住,我无权更改 ModuleAModuleB,我该如何让它发挥作用?

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

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    假设您定义了以下绑定:

    模块C

    • C1

    模块A

    • A1
    • A2

    模块B

    • B1
    • B2

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

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

    由于 C1 绑定被列出两次,这会产生冲突并导致 CreationException

    但如果你改用Modules.override()

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

    例如通过做

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

    您的最终绑定列表如下:

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

    继承自 ModuleA 的 C1 绑定将被丢弃,取而代之的是 ModuleB 中定义的 C1 绑定,从而解决了冲突。

    【讨论】:

    • 我试过Guice.createInjector(Modules.override(new ModuleA(), new ModuleB()).with(new ModuleC()));
    • 这行得通。 Guice.createInjector(Modules.override(new ModuleA()).with(new ModuleB())。谢谢。但是你能详细说明一下你的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2016-10-16
    • 1970-01-01
    • 2016-03-01
    • 2019-05-02
    • 2016-02-24
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多