2013-10-25 14 views
7

については通知されません、私は次のGuiceモジュールを持っている:私は奇妙見つけたものGuiceのTypeListener注入されたクラス型

class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bindListener(Matchers.any(), new TypeListener() {...});  
    } 

    @Provides 
    SomeClass createSomeClass(final Parameter param) { 
     log(param.getValue()); <-- this gets logged 
     ... 
    } 
} 

は私TypeListenerParameterタイプについて通知されませんということです。プロバイダが呼び出され、SomeClassを返しても、私はまた、ログのステートメントを参照してください明らかにParameter Guiceによって注入された。

私はUntargetted bindingsと文の承知している:

untargettedバインディングは、タイプについての注射器を通知し、それは熱心に依存関係を作成することができます。

私はまだGuiceのは、明示的にが初めて注入バインドされ、あらゆるタイプのためTypeListenerを呼び出すことを期待します。

私はそのようなクラスのための目標を定められていないバインディングを経験則として作る必要がありますか?

注:Parameterコンストラクタに@Injectを付けてマーキングしても問題は解決しません。

EDIT:

完全な例(希望は私はあまりゴミを残すdin't)は次のとおりです。

public class TestGuice { 

    public static void main(String[] args) { 
     Injector parentInjector = Guice.createInjector(new ParentModule()); 
     Injector childInjector = parentInjector.createChildInjector(new SubModule()); 

     childInjector.getInstance(Runnable.class).run(); 
    } 

    static class ParentModule extends AbstractModule { 

     @Override 
     protected void configure() { 

     } 
    } 

    static class SubModule extends AbstractModule { 

     @Override 
     protected void configure() { 
      bind(SampleInjectedClass.class); // <-- Comment/uncomment here 

      final TypeListener typeListener = new TypeListener() { 
       public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) { 
        System.out.println("Type: " + type.getRawType()); 
       } 
      }; 

      bindListener(Matchers.any(), typeListener); 
     } 

     @Provides 
     Runnable createRunnable(final SampleInjectedClass sampleClass) { 
      return new Runnable() { 

       @Override 
       public void run() { 
        sampleClass.test(); 
       } 
      }; 
     } 
    } 

    static class SampleInjectedClass { 
     public void test() { 
      System.out.println("Test"); 
     } 
    } 
} 

ラインが存在する場合、出力は次のようになります。

種類:クラスcom.barcap.test.TestGuice $ SampleInjectedClass

種類:クラスcom.google.inject.internal.ProviderMethod

テスト

私は行を削除した場合、私が取得:

タイプ:クラスcom.google.inject.internal.ProviderMethod

テスト

インジェクタがで作成されなかった3210コードbind(...)は必要ありません。

+0

指定されたコードでは問題を再現するには十分ではありません。私は投稿されたコードに特に間違ったことは何も表示されません、あなたはTypeListenerが呼び出されていないことをどのように知っていますか? –

+0

付属の完全な例をご覧ください –

+0

さて、私は何が起こっているのか分かりました。 –

答えて

0

コードを確認できますか? Guice 3に関する私のテストでは、I couldn't reproduce what you're seeingTypeListener docsからも

、重点鉱山とSiCタイプミス:Guiceのコンストラクタまたはメンバー注入の対象と新しいタイプに遭遇したときに呼び出されます

public abstract void hear (TypeLiteral<I> type, TypeEncounter<I> encounter)

。インジェクタの作成時に呼び出される(またはGuiceが実行時に型に遭遇し、JITバインディングを作成した場合)

インジェクタが作成されるとすぐに、他のすべての依存関係がTypeListenerで呼び出されますが、implicit ("just-in-time")バインディングは実行されません。

上記の例に基づいて、パラメータがプロバイダメソッドに含まれている場合、パラメータはすぐに同じリスナーに登録されているようです。あなたが求めている行動を示す短い自己完結型の例を作り出せますか?

+0

試してみます。私はもっ​​と複雑な例から重要な部分を抽出しようとしましたが、明らかに何かを逃した可能性があります。一つの重要なことは、私が 'childInjector'を使っていたことかもしれません。提案された例を抽出して元に戻します。 –

+0

更新を参照してください –

関連する問題