2016-06-17 4 views
0

Я использую Guava EventBus, и я регистрирую подписчиков через прослушиватель типа на основе great example. Текущий код выглядит следующим образомEager экземпляр через Guice TypeListener для Guava Подписчики EventBus

bindListener(methodsAnnotatedWith(Subscribe.class), new TypeListener() { 
    @Override 
    public <I> void hear(TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) { 
     typeEncounter.register(new InjectionListener<I>() { 
      @Override 
      public void afterInjection(I i) { 
       register(i); // register with event bus 
      } 
     }); 
    } 
}); 

Короче код делает следующее

  1. Найти все классы, которые имеют публичный метод с аннотацией @Subscribe
  2. После инъекции, регистрации фактического абонента с event bus

Проблема, с которой я сталкиваюсь, заключается в том, что она регистрирует только тех подписчиков, которые были фактически введены и были инициализируется. Если есть подписчик, который не использовался до публикации события, он не будет инициализирован.

Все подписчики правильно найдены в методе hear (перед регистрацией прослушивателя инъекций при встрече типа), но они не создаются, потому что они лениво инициализированы.

Есть ли способ сделать что-то вроде нетерпеливого экземпляра (похоже на binding.asEagerSingleton()) на подписчиков? Я знаю, что мне придется позаботиться о том, являются ли они одиночными.

+1

Я бы использовал «Multibinder», чтобы зарегистрировать его явно в конфигурациях модулей. –

ответ

1

Я сделал ту же самую встречу eventBus/guice некоторое время назад. Я играл с

https://github.com/ronmamo/reflections 

для выявления всех классов, содержащих методы аннотированные с @Subscribe, а затем зарегистрировать их в модуле (bindEager).