Guice相当于Spring的@Autowire实例列表

时间:2014-08-26 12:43:20

标签: java guice

春天的时候我这样做:

@Autowire
List<MyInterface> myInterfaces;

然后这个列表将被实现MyInterface的所有bean填充。我没有必要创建List<MyInterface>类型的bean。

我正在Google Guice中寻找此类行为。

Sofar我去了:

Multibinder<MyInterface> myInterfaceBinder = MultiBinder.newSetBinder(binder(), MyInterface.class);

现在,如果我有一个实现MyInterface的bean并将其绑定,请通过:

bind(MyInterfaceImpl.class).asEagerSingleton();

它不会被包含在我的multibinder中。我需要补充一下:

myInterfaceBinder.addBinding.to(MyInterfaceImpl.class);

这比Spring提供的要复杂一些。所以我很惊讶我是不是以错误的方式使用它。那么有更简单的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:2)

我自己并没有这样使用它,但是根据Guice的API文档,我认为你应该能够写出比这更多的东西:

bindListener(Matchers.subclassesOf(MyInterface.class), new TypeListener() {
  public <I> void hear(TypeLiteral<I> typeLiteral,
                       TypeEncounter<I> typeEncounter) {
    myInterfaceBinder.addBinding().to(typeLiteral);
  }
}

然后,当您通过

绑定实现时
bind(MyInterfaceImpl.class).asEagerSingleton();

它应该自动添加到您的multibinder。

答案 1 :(得分:1)

一个hacky解决方案是在循环中完成所有操作:

Multibinder<MyInterface> myInterfaceBinder
    = MultiBinder.newSetBinder(binder(), MyInterface.class);

Class<? extends MyInterface>[] classes = {
    MyInterfaceImpl,
    YourInterfaceImpl.class,
    MyCatsInterfaceImpl
};

for (Class<? extends MyInterface> c : classes) {
    bind(c).asEagerSingleton();
    myInterfaceBinder.addBinding.to(c);
}

这很hacky,它只适用于这种简单的情况,但它很简单且干燥。