【问题标题】:Guice - How to let multiple multiple modules contribute to one thing?Guice - 如何让多个模块为一件事做出贡献?
【发布时间】:2025-12-02 20:05:01
【问题描述】:

我想知道是否可以让模块进行特定绑定,然后注入这些绑定的组合。

简单示例:我有一个应该注入的List<SomeType>,并且多个模块应该能够向该列表添加/绑定元素。 基本上使用跨不同模块的绑定(或多重绑定)。 我怎样才能做到这一点,哪种方法最好?什么都想不出来。

【问题讨论】:

  • 您是否有此绑定的提供者,或者您希望如何使绑定可注入?
  • @Nico 我还没有任何东西,我仍然需要一种方法。而且我不知道如何为它创建一个 Provider,因为它可以来自不同的模块。

标签: java guice


【解决方案1】:

使用 Multibinder 扩展

但是...您必须使用Set 而不是List

另外,在开始之前,请注意虽然 Multibinder 是一个扩展,但它已经集成到主要的 Guice 工件中用于几个版本。

像这样创建一个通用的静态方法:

public static LinkedBindingBuilder<SomeType> bindSomeTypeSetElement(Binder binder) {
  return Multibinder.newSetBinder(binder, SomeType.class).addBinding();
}

我告诉你写这样一个方法是因为以后更容易找到绑定定义,如果你想把SomeType改成OtherType,用一种方法会更容易。最后,如果您想更改绑定(例如使用注释进行标识),也更容易。

现在在你要绑定的模块中,只需在你的configure 方法中编写以下代码:

import static path.to.SomeTypeBinder.bindSomeTypeSetElement;

public void configure() {
  bindSomeTypeSetElement(binder()).toInstance(new ConcreteType());
  bindSomeTypeSetElement(binder()).to(SecondConcreteType.class);
  bindSomeTypeSetElement(binder()).toProvider(new ThirdConcreteTypeProvider());
}

【讨论】:

  • 谢谢!我会尝试处理这个然后接受你的回答:)