如果我有一个接口IBaseFunction和这个接口的多个实现。 如何迭代调用每个方法的绑定。
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind( IBaseFunction.class).annotatedWith( ExDelete.class).to( ExDeleteFunction.class);
bind( IBaseFunction.class).annotatedWith( ExAdd.class).to( ExAddFunction.class);
...
}
}
我需要在每个绑定上调用一个函数'publish()(使得处理程序在总线上可用)
我可以像这样单独调用每个绑定上的函数: -
ExDeleteFunction functionExDelete = injector.getInstance( ExDeleteFunction.class);
ExDeleteFunction.publish();
ExAddFunction functionExAdd = injector.getInstance( ExAddFunction.class);
ExAddFunction.publish();
然而,我想做的是迭代这些并在所有这些上调用'publish'函数,有没有办法做到这一点? 也许使用injector.getAllBindings()?这样的事情: -
Injector injector = Guice.createInjector( new ServicesModule() );
Map<Key<?>, Binding<?>> bindings = injector.getAllBindings();
for (Binding<?> binding : bindings.values()) {
Key<?> key = binding.getKey();
...??
还是有更简单的方法?
答案 0 :(得分:2)
是的,有更简单的方法,称为Multibindings。有了这个,你就可以做类似
的事情public class BaseFunctionsModule extends AbstractModule {
@Override
public void configure() {
Multibinder<BaseFunction> multibinder = Multibinder.newSetBinder(binder(), BaseFunction.class);
mapBinder.addBinding().to(ExDeleteFunction.class);
mapBinder.addBinding().to(ExAddFunction.class);
// others
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new BaseFunctionsModule());
Set<BaseFunction> functions = injector.getInstance(new TypeLiteral<Set<BaseFunction>>() {});
for (BaseFunction function : functions) {
function.publish();
}
}
然而,通过这种方式,可能无法单独注入您的功能(我不知道,您需要测试它);您也可以查看MapBinder。