我正在使用Guava EventBus,并通过基于great example的类型侦听器注册订户。当前代码如下所示
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
注释的公共方法的类注入后,向事件总线注册实际订户
我使用这种方法的问题在于,它仅注册实际上已注入并已初始化的订户。如果在发布事件之前有未使用的订阅者,则不会对其进行初始化。
在
hear
方法中正确找到了所有订阅者(在对类型遇到的注册注入侦听器之前),但是未实例化它们,因为它们是延迟初始化的。有没有一种方法可以对订阅者执行类似实例化的操作(类似于
binding.asEagerSingleton()
)?我知道我将不得不照顾他们是否单身。 最佳答案
不久前,我进行了相同的eventBus / guice耦合。我玩过
https://github.com/ronmamo/reflections
识别所有包含用@Subscribe注释的方法的类,然后将其注册到模块(bindEager)中。