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

时间:2014-06-25 20:58:34

标签: java dynamic proxy guice

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

interface ITaggingInterface() {
}

interface ISubInterface extends ITaggingInterface {
  String doSomething();
}

可以使用代理实现ISubInterface:

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

如何检测我的进样器,以便每次请求子接口时,它都使用动态代理来创建实现。

我知道我可以分别绑定每个子接口,但这是我想要避免的。我正在寻找类似的东西:

bind(any-sub-interface).toProvider(provider-that-creates-proxy-instance);

这可能与guice有关吗?

1 个答案:

答案 0 :(得分:1)

我不相信您可以通过无与伦比的方式寻找这种方式。在它的核心,Guice的绑定就像Map<Key, Provider>。这使得很难用这个注释来绑定任何类型&#34;,&#34;这种类型的任何子类型#34;或其他类似匹配器的绑定。

如果您可以使用方法/字段注入和自定义注释而不是@Inject,则可以尝试使用custom injection,这将允许您检查注入的类并根据需要操作它们的方式以上链接与@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);
    }
  }
}