2016-06-17 2 views
0

私はGuava EventBusを使用していますが、great exampleに基づくタイプのリスナーを使用してサブスクライバを登録しています。現在のコードは、短いコードでは、このGuice TypeListenerを使用したGuava EventBus Subscriberのインスタント化

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. で注釈を付けパブリックメソッドを持っているすべてのクラスを検索しない、との実際の加入者を登録しますイベントバス

私がこの方法で持っている問題は、実際に注入されている加入者だけが登録されていることです初期化されました。イベントを送信する前に使用されていない加入者が存在する場合、その加入者は初期化されません。

hearメソッドではすべてのサブスクライバが正しく検出されます(型エンカウンターに注入リスナーを登録する前に)が、遅延初期化されているため、インスタンス化されません。

サブスクライバで熱心なインスタンス化(binding.asEagerSingleton()に似ています)のようなことをする方法はありますか?私は彼らがシングルトンであるかどうかを世話する必要があることを知っています。

+1

モジュール構成で明示的に登録するには 'Multibinder 'を使います。 –

答えて

1

少し前に同じイベントバス/ガイスカップリングをしました。私は@Subscribeでアノテートメソッドを含むすべてのクラスを識別し、モジュール(bindEager)に登録する

https://github.com/ronmamo/reflections 

で遊ん。

関連する問題