通过Guice TypeBiste订阅者

时间:2016-06-17 15:43:21

标签: java guava guice event-bus

我正在使用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
            }
        });
    }
});

简而言之,代码执行以下操作

  1. 查找所有使用@Subscribe
  2. 注释的公共方法的类
  3. 注入后,使用事件总线注册实际用户
  4. 我使用这种方法的问题是它只注册实际注入并已初始化的订户。如果订阅者在发布活动之前尚未使用,则不会对其进行初始化。

    hear方法中正确找到所有订阅者(在类型遭遇上注册注入侦听器之前),但它们没有实例化,因为它们被懒惰地初始化。

    有没有办法在订阅者身上做一些急切的实例化(类似于binding.asEagerSingleton())?我知道我必须照顾他们是否是单身人士。

1 个答案:

答案 0 :(得分:1)

前一段时间我做了同样的事件/ guice耦合。我玩了

https://github.com/ronmamo/reflections

标识包含使用@Subscribe注释的方法的所有类,然后在模块中注册它们(bindEager)。