次の Guice モジュールがあります。
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
...
}
}
私が奇妙だと思ったのは、タイプTypeListener
について通知されないことです。Parameter
プロバイダーが呼び出されて返されますがSomeClass
。ログ ステートメントも表示されるのでParameter
、Guice によって注入されたことがはっきりとわかります。
@Override
protected void configure() {
bind(Parameter.class);
bindListener(Matchers.any(), new TypeListener() {...});
}
Untargeted bindingsと次のステートメントを認識しています。
対象外のバインディングはインジェクターに型について通知するため、依存関係を熱心に準備できます。
TypeListener
明示的にバインドされた、または初めて注入された型に対して、 Guiceがを呼び出すことを期待します。
経験則として、そのようなクラスに対して非対象バインディングを作成する必要がありますか?
注:Parameter
コンストラクターを でマークして@Inject
も問題は解決しません。
編集:
完全な例 (あまりにも多くのゴミを残さないことを願っています) は次のとおりです。
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
テスト
createChildInjector
インジェクターがコードを介して作成されていない場合、必要ないことに気付きましたbind(...)
。