CDI を使用してアプリケーションを拡張可能にしようとしていますが、パズルのピースが欠けているようです。
私が欲しいもの:使用するインターフェースの実装を定義するグローバル構成を用意してください。実装には、@ImplDescriptor(type="type1") のような注釈があります。
私が試したこと:
@Produces
public UEInterface createUserExit(@Any Instance<UEInterface> instance, InjectionPoint ip) {
Annotated annotated = ip.getAnnotated();
UESelect ueSelect = annotated.getAnnotation(UESelect.class);
if (ueSelect != null) {
System.out.println("type = " + ueSelect.type());
}
System.out.println("Inject is ambiguous? " + instance.isAmbiguous());
if (instance.isUnsatisfied()) {
System.out.println("Inject is unsatified!");
return null;
}
// this would be ok, but causes an exception
return instance.select(ueSelect).get();
// or rather this:
for (Iterator<UEInterface> it = instance.iterator(); it.hasNext();) {
// problem: calling next() will trigger instantiation which will call this method again :(
UEInterface candidate = it.next();
System.out.println(candidate.getClass().getName());
}
}
このコードは、私が見た例に近いものです。@Produces メソッドを使用してインスタンスを選択および作成し、候補のリストを Instance<E> として挿入します。メソッドが単純に実装を作成して返す場合、問題なく動作します。Instance<E> から候補を調べて選択する方法がわかりません。「コンテンツ」を見る唯一の方法は、Iterator<E> のようです。しかし、next() を呼び出すとすぐに、実装を作成しようとします... 残念ながら、そのために @Produces メソッドを呼び出すため、無限再帰が作成されます。私は何が欠けていますか?候補者を調査して選択するにはどうすればよいですか? もちろん、そのうちの1つだけをインスタンス化したい...
助けとヒントを事前にありがとう!