java - Guice 迭代多个绑定(bind)

标签 java binding guice

如果我有一个接口(interface) IBaseFunction 和该接口(interface)的多个实现。 如何迭代调用每个即上的方法的绑定(bind)

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);
...

  }
}

我需要在每个绑定(bind)上调用函数“publish()”(使处理程序在总线上可用)

我可以像这样单独调用每个绑定(bind)上的函数:-

ExDeleteFunction functionExDelete = injector.getInstance( ExDeleteFunction.class);
ExDeleteFunction.publish();
ExAddFunction functionExAdd = injector.getInstance( ExAddFunction.class);
ExAddFunction.publish();

但是我想做的是迭代这些并调用所有这些函数的“发布”函数,有没有办法做到这一点? 也许使用injector.getAllBindings()?像这样的东西:-

  Injector injector = Guice.createInjector( new ServicesModule() );

  Map<Key<?>, Binding<?>> bindings = injector.getAllBindings();
  for (Binding<?> binding : bindings.values()) {
      Key<?> key = binding.getKey();
...??

或者有更简单的方法吗?

最佳答案

是的,有更简单的方法,称为 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();
    }
}

但是,这样可能无法单独注入(inject)你的函数(我不知道,你需要测试一下);您还可以查看MapBinder .

关于java - Guice 迭代多个绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588605/

相关文章:

WPF 将一个 ViewModel 用于多个 UserControls

java - struts2中默认拦截器抛出的异常如何处理?

java - 使用线程池的 Eclipse 作业 API?

java - 使用环境变量覆盖 application.properties 中的变量的 Spring 怪异行为

java - Selenium 2 WebDriver NoClassDefFoundErrorS

java - 通过反射动态给Guice添加类

wpf - 绑定(bind)更新将新闻系列添加到 WPF 工具包图表(而不是替换/更新系列)

c# - 将一个类中的值绑定(bind)到另一类中的另一个值

java - Google Guice 中使用 Key 和不使用 Key 的 Binder.bind 之间的区别?

java - 与默认类加载器和 PlayFramework 自定义类加载器冲突