在Guice中注入方法拦截器

时间:2015-07-20 23:10:30

标签: java guice

我已经在网上搜索了它,所有人(包括)google建议使用requestInjection(),但我仍然不了解如何使用它。我有一个实现Method Interceptor的类:

public class CacheInterceptor implements MethodInterceptor {
    private ILocalStore localStore;
    private IRemoteStore remoteStore;
    private CacheUtils cacheUtils;

    public CacheInterceptor() {
    }
   @Inject
    public CacheInterceptor(ILocalStore localStore, CacheUtils cacheUtils, IRemoteStore remoteStore) {
    this.localStore = localStore;
    this.cacheUtils = cacheUtils;
    this.remoteStore = remoteStore;
    }
}

我有3个课程延伸AbstractModule

public class CacheUtilModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(CacheUtils.class);
    }
}

public class LocalCachingModule extends AbstractModule {
    @Override
    public void configure() {
        bind(ILocalStore.class).to(LocalStore.class);
    }
}

public class RedisCachingModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(IRemoteStore.class).to(RemoteStore.class);
    }
}

我为绑定拦截器

做了以下操作
public class RequestScopedCachingModule extends AbstractModule {

    @Override
    public void configure() {
        install(new CacheUtilModule());
        install(new LocalCachingModule());
        install(new RedisCachingModule());
        MethodInterceptor interceptor = new CacheInterceptor();
        requestInjection(interceptor);
        bindInterceptor(Matchers.any(),   Matchers.annotatedWith(Cacheable.class),
            interceptor);
    }

}

基本上,我想在我的MethodInterceptor中注入localStore,remoteStore和cacheUtils,并在我的3个模块中映射出我自己的实现。但这并没有奏效。我想我只是对requestInjection()感到困惑。在文档中,requestInjection执行此操作

  

成功创建后,Injector将注入给定对象的实例字段和方法。

但是我们在哪里指定接口和实现类之间的映射?我怎样才能得到我想做的工作?

1 个答案:

答案 0 :(得分:1)

requestInjection只会注入字段和方法 - 它不会调用构造函数,也不会对构造函数上的@Inject注释有任何了解。如果您将@Inject添加到所有字段,则代码应按预期运行。