Java Guice:将接口绑定到由动态代理创建的实例

Java Guice:将接口绑定到由动态代理创建的实例,java,dynamic,proxy,guice,Java,Dynamic,Proxy,Guice,我正在寻找一种解决方案,将标记接口的任何子接口绑定到由java动态代理创建的实例。动态代理知道如何在子接口中实现每个方法。问题是,我想为请求的所有子接口自动执行此操作 interface ITaggingInterface() { } interface ISubInterface extends ITaggingInterface { String doSomething(); } ISubInterface可以通过使用代理来实现: ISubInterface si = (ISubIn

我正在寻找一种解决方案,将标记接口的任何子接口绑定到由java动态代理创建的实例。动态代理知道如何在子接口中实现每个方法。问题是,我想为请求的所有子接口自动执行此操作

interface ITaggingInterface() {
}

interface ISubInterface extends ITaggingInterface {
  String doSomething();
}
ISubInterface可以通过使用代理来实现:

ISubInterface si = (ISubInterface)Proxy.newProxyInstance(classloader, new Class<?>[]{ISubInterface.class}, invocationHandler);

guice能做到这一点吗?

我不相信你所期待的那种无缝方式能做到这一点。在它的核心,Guice的绑定就像一个
映射
。这使得绑定“带有此注释的任何类型”、“此类型的任何子类型”或其他类似matcher的绑定变得困难

如果您同意使用方法/字段注入和自定义注释而不是@Inject,那么您可以尝试使用,这将允许您检查注入的类并根据需要操作它们,就像上面链接对@InjectLogger所做的那样

除了重组您的需求之外,我个人的解决方案如下:

/** Injectable. */
class TaggingInterfaceFactory {
  /** Guice can always inject the injector. */
  @Inject Injector injector;

  <T> T getInstanceOrProxy(Class<T> clazz) {
    if (clazz.isAssignableFrom(ITaggingInterface.class)) {
      return createYourProxyHere(clazz);
    } else {
      return injector.getInstance(clazz);
    }
  }
}
/**可注入*/
类标记接口属性{
/**Guice始终可以注入注入器*/
@注入器;
T getInstanceOrProxy(类clazz){
if(类别可从(ItagginInterface.class))中指定){
返回createYourProxyHere(clazz);
}否则{
返回injector.getInstance(clazz);
}
}
}
/** Injectable. */
class TaggingInterfaceFactory {
  /** Guice can always inject the injector. */
  @Inject Injector injector;

  <T> T getInstanceOrProxy(Class<T> clazz) {
    if (clazz.isAssignableFrom(ITaggingInterface.class)) {
      return createYourProxyHere(clazz);
    } else {
      return injector.getInstance(clazz);
    }
  }
}