春天的时候我这样做:
@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提供的要复杂一些。所以我很惊讶我是不是以错误的方式使用它。那么有更简单的方法来实现这个目标吗?
答案 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,它只适用于这种简单的情况,但它很简单且干燥。