使用带有静态绑定参数的google guice

时间:2016-06-15 21:42:22

标签: java dependency-injection inversion-of-control guice

我想用guice绑定一些参数,类似于guice将未注释的Injector类绑定到调用注入器实例以供提供者使用。

特别是,在我们的项目中,我们有一个名为ResourceEnvironment的对象,该对象实际上是方法Class.getClassLoader().getResource()的包装器,使我们能够优雅地转换“com-paths”(类相对资源)路径)到它们代表的资源(FXML文件,图像文件等)。我们使用它来加载我们jar中部署的资源。

现在,这段代码以极大的频率重复:

Class ClazzX{

  private final ResourceEnvironment env;

  @Inject
  public ClazzX(ResourceEnvironment.Factory envFactory){
    env = envFactory.create(this.getClass())
  }
}

当我真正想做的事情更简单时:

Class ClazzX{

  private @Inject ResourceEnvironment env;

}

但要做到这一点,我实际上需要一个提供者:

binder.install(new Module(){

    @Provides ResourceEnvironment getResourceEnv(Injector callingInjector){
      Class targetClazz = callingInjector.getDependencyBeingResolved(); //not a real method
      ResourceEnivonment.Factory factory = callingInjector.getInstance(RE.F.class)
      return factory.create(targetClazz);
    }
});

是否可以在运行时获取有关当前通过进样器解析的类型的一些信息?

1 个答案:

答案 0 :(得分:1)

使用自定义注入记录器作为模板(https://github.com/google/guice/wiki/CustomInjections),应该很容易实现使用声明类作为环境注入源的特定成员注入器。据我所知,这也需要一个自定义注释。

class ResourceEnvironmentMembersInjector<T> implements MembersInjector<T> {
   private final Field field;
   private final ResourceEnvironment  env;

   ResourceEnvironmentMembersInjector(Field field) {
     this.field = field;
     env = envFactory.create(field.getDeclaringClass());
     field.setAccessible(true);
  }

  public void injectMembers(T t) {
    try {
      field.set(t, env);
    } catch (IllegalAccessException e) {
      throw new RuntimeException(e);
    }
  }
}