繁体   English   中英

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

[英]Guice: binding interface to instance created by dynamic proxies

我正在寻找一种解决方案,以将标记接口的任何子接口绑定到由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有可能吗?

我认为您所寻找的无缝方式不可能做到这一点。 从本质上讲,Guice的绑定就像Map<Key, Provider> 这使得绑定“带有此注释的任何类型”,“此类型的任何子类型”或其他类似匹配器的绑定变得困难。

如果您可以使用方法/字段注入和自定义批注而不是@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);
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM