2015-07-20 2 views
1

Я искал по всему Интернету, и все (в том числе) google предлагает использовать requestInjection(), но я до сих пор не понимаю, как его использовать. У меня есть класс, который реализует метод Interceptor:Перехватчики метода ввода в Guice

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

} 

Так в основном, я хочу, чтобы впрыснуть localStore, remoteStore и cacheUtils в моем MethodInterceptor с моей собственной реализацией наметило в моих 3-х модулей , Но это не сработало. Наверное, меня просто смущает requestInjection(). В документации requestInjection делает это

После успешного создания Инжектор будет вводить поля экземпляра и методы данного объекта.

Но где мы указываем сопоставление между интерфейсом и классом реализации? Как я могу получить то, что я хотел сделать, чтобы работать?

ответ

1

requestInjection будет только вводить поля и методы - он не будет вызывать конструктор и ничего не знает о аннотациях @Inject на вашем конструкторе. Если вы добавите @Inject ко всем своим полям, ваш код должен работать так, как вы ожидаете.

+0

Так будет ли это работать с сеттерами? Просто проверил его, и он работает для сеттеров! Спасибо @condit –

Смежные вопросы