Я использую 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
}
});
}
});
Короче код делает следующее
- Найти все классы, которые имеют публичный метод с аннотацией
@Subscribe
- После инъекции, регистрации фактического абонента с event bus
Проблема, с которой я сталкиваюсь, заключается в том, что она регистрирует только тех подписчиков, которые были фактически введены и были инициализируется. Если есть подписчик, который не использовался до публикации события, он не будет инициализирован.
Все подписчики правильно найдены в методе hear
(перед регистрацией прослушивателя инъекций при встрече типа), но они не создаются, потому что они лениво инициализированы.
Есть ли способ сделать что-то вроде нетерпеливого экземпляра (похоже на binding.asEagerSingleton()
) на подписчиков? Я знаю, что мне придется позаботиться о том, являются ли они одиночными.
Я бы использовал «Multibinder», чтобы зарегистрировать его явно в конфигурациях модулей. –