有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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) 个答案

  1. # 1 楼答案

    我不相信这是可能的无缝方式,你正在寻找。在它的核心,Guice的绑定就像一个Map<Key, Provider>。这使得绑定“带有此注释的任何类型”、“此类型的任何子类型”或其他类似matcher的绑定变得困难

    如果您同意使用方法/字段注入和自定义注释而不是@injector,那么可以尝试使用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);
        }
      }
    }