私はプロジェクトを持っています。私は自分のプロジェクトにインジェクトしたいIImplementMeと呼んでいます。このインターフェイスはさまざまなプロデューサによって実装されるため、すべての実装を注入する必要があります。私はこのためにTypeLiteralを使用しようとしています。私のプロジェクトで、私はこのようにそれを注入し、TypeLiteralを使用したJavaインジェクションの実装
@Singleton
public class SomeImplementation implements IImplementMe {
private final String value;
@Inject
public SomeImplementation(final SomeOtherConfig configuration) {
this.value= configuration.getValue();
}
@Override
public String getValue() {
return value;
}
}
そして、私のレジストリクラスで、私はその後register(IImplementMe.class).to(SomeImplementation.class);
を持っている:ここで
は、プロデューサーのコードである
@Inject
public SomeEndpoint(final List<IImplementMe> implementations){
///
}
と私のように縛る
private static class MarketDataSetTypeLiteral extends TypeLiteral<List<IImplementMe>> {
}
bind(new MarketDataSetTypeLiteral()).toRegistry();
私のSomeIMplementationコンストラクタが呼び出されたことを確認しましたが、私のエンドポイントでListが空であるため、実装は提供されていません。私は注射のためにguiceを使用しています。何か案は ?
LE:エンドポイントクラスを作成した後(作成時に空のリストの参照を注入する)、提供された実装が作成されていることがわかります。ライフサイクルの後半ではリファレンスが実装されて更新されているので、実際にguiceがそれを実行した後にアクセスします。
私は、それがmavenの依存関係、guiceがインスタンス化をどのように処理しているのかと推測しています。プロデューサーは自分のプロジェクトに依存しなければならないので、最後にインスタンス化されるのは当然のことだと思います。
'CustomTypeLiteral'(' MarketDataSetTypeLiteral'を意味しましたか?)や 'toRegistry'で何をしようとしているのか分かりません。一般に、[Multibindings](https://github.com/google/guice/wiki/Multibindings)と同様の機能を実行しようとしているようですが、自分のレジストリを使用しているようです。 'bind(...)toRegistry()'が何をすべきか、あるいはそれをどのように実装したかをもっと見せてくれますか? –
はい、申し訳ありませんが、MarketDataSetTypeLiteralとなっています。レジストリの実装では、基本的にyarレジストリの実装です(リンク:https://github.com/javabits/yar/blob/master/yar-guice/src/main/java/org/javabits/yar/guice/RegistryAnnotatedBindingBuilderImpl .java)。 –