我正在寻找一种解决方案,将标记接口的任何子接口绑定到由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的绑定就像一个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);
}
}
}