Google Guice:注入原始数据结构的正确方法

Google Guice: right way to inject primitive data structure

private HashSet<WorkWindow> childWorkWindows;

@Inject
public CompositeWorkWindows (
        HashSet childWorkWindows
) {
    this.childWorkWindows = childWorkWindows;
}

Guice 知道如何自动注入这个而无需在模块中指定任何内容吗?

我担心的是我在私有字段中指定了 HashSet 的类型。

必须先绑定

在您的配置中:

@Provides HashSet<WorkWindow> provideChildWorkWindows() {
  // Create and return your HashSet<WorkWindow>
}

那么只有它可以注射到您的 CompositeWorkWindows.

如果您想绑定多个独立的 WorkWindow,请使用 Guice 的多重绑定。但在那种情况下,您应该使用接口 Set 作为接收者,而不是 HashSet 实现,因为 Guice 将提供 Set 而不是 HashSet。请注意,多重绑定允许您在不同模块中拥有元素的定义。

MyModule.java:

Multibinder<WorkWindow> workWindowBinder = Multibinder.newSetBinder(binder(), WorkWindow.class);
workWindowBinder.addBinding().toInstance(new MyWorkWindow());

OtherModule.java:

Multibinder<WorkWindow> workWindowBinder = Multibinder.newSetBinder(binder(), WorkWindow.class);
workWindowBinder.addBinding().to(OtherWorkWindow.class);

FinalModule.java:

Multibinder<WorkWindow> workWindowBinder = Multibinder.newSetBinder(binder(), WorkWindow.class);
workWindowBinder.addBinding().toProvider(new FinalWorkWindowProvider());

如果注入器中存在所有模块,您将得到一个大小为 3 的 Set,其中包含您创建的三个不同的 WorkWindow