我正在使用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)中。

07-24 09:38
查看更多