2014-06-25 68 views
1

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

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); 

这可能与吉斯?

回答

0

我不相信这是可能的无缝方式,你正在寻找。在心里,Guice的绑定就像是Map<Key, Provider>。这使得很难绑定“任何类型与这个注释”,“任何这种类型的子类型”,或者像这样的其他匹配器类似的绑定。

如果您可以使用方法/字段注入和自定义注释代替@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); 
    } 
    } 
} 
相关问题