私が持っているユースケースはこれです:
オブジェクトは、特定のタイプのバインドされていない@Namedインジェクションを要求します。Guiceに「フォールバック」プロバイダーに名前の値を教えてもらいたい(またはアノテーション全体を教えてもらいたい)ので、プロバイダーは名前の値に基づいて実装を提供できます。
したがって、@ Named値は、実行時に正しい実装を見つけるためのキーとして使用されます。@Namedに基づいて実装が見つかった場合は、プロバイダーに相談しないでください。
Guiceは基本的に、(注釈、タイプ)タプルから。へのマップProvider<T>
です。バインドされていないすべてのインスタンスにデフォルトのバインドをバインドする方法は@Named
、doubleの範囲全体を。内の単一の文字列にバインドする方法以外にありませんMap<Double, String>
。
必要なすべての@Named
値の便利な配列またはコレクションがある場合は、それらをループして、それらすべてをある種のデフォルトプロバイダーにバインドし、ループ内のブロックを使用してハッキングすることができModules.override()
ますif
。
public class DefaultNameModule extends AbstractModule() {
@Override public void configure() {
for (String name : YOUR_LIST_OF_NAMES) {
if (properties.contains(name)) {
bindConstant(properties.get(name)).annotatedWith(Names.named(name));
} else {
bind(Foo.class)
.annotatedWith(Names.named(name))
.toProvider(new MyProvider(name));
}
}
}
private static class MyProvider extends Provider<Foo> {
final String name;
MyProvider(String name) {
this.name = name;
}
@Override public Foo get() {
return someValueBasedOn(name);
}
}
}
これが複雑すぎて好みに合わない場合は、Properties
アクセスをラップする1つのメソッドオブジェクトのインスタンスをいつでも挿入でき、必要に応じてデフォルトを計算できることを覚えておいてください。