3

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つだけをインスタンス化したい...

助けとヒントを事前にありがとう!

4

2 に答える 2

1

フィンチ、ここにあるものはうまくいくはずです。ただし、UEInterface注釈付きのインスタンスがあることを前提としています。@UESelect

@UESelect("one")
public class UEOne implements UEInterface {
..
}

これはあなたがそれがうまくいくことを期待している方法ですか?

于 2013-09-25T22:12:45.317 に答える