2017-01-18 12 views
0

私は、アプリケーションでクラスの変数グループを動的に注入する必要があります。アプリケーションが大きくなるにつれて、同じインターフェイスを継承するクラスを追加するだけで済みます。これは、パッケージ内のすべてのクラスを検索し、それらをインスタンス化するためのループを実行するだけで済むので、tradicional javaで簡単に行うことができます。 CDIでやりたいたとえば:CDI:クラスのグループの動的注入方法?

public MyValidatorFactory { 
for (String className: classNames) { 
    @Inject 
    MyValidatorInterface<className> myValidatorInstance; 
    myValidatorInstance.validate(); 
} 
} 

私はクラス名のリストで見つかったすべての実装をループ(すべての意志をしたい:

public MyValidatorInterface { 
public boolean validate(); 
} 

@Named 
MyValidator1 implements MyValidatorInterface 
... 

@Named 
MyValidator2 implements MyValidatorInterface 
... 

は今醜い非リアルタイムJavaコードはちょうど私が何をしたいのアイデアを取得するには次の週にMyValidator3という新しいバリデーターを追加したら、新しいクラスをコーディングしてプロジェクトに追加するだけです。 MyValidatorFactoryのループは、それを見つけて挿入し、新しいクラスに対してもvalidate()メソッドを実行します。

私はダイナミックインジェクションについて読んだことがありますが、以前のようにインスタンス化するのと同じように、クラス名のグループをループして注入する方法が見つかりません。あなたが記述している何

おかげ

+0

CDIでInstance' 'を見てください、これはあなたが探しているものです:あなたはこのような何かをしたいと思うでしょうjavax/enterprise/inject/Instance.html。 – Rouliboy

+0

ご意見ありがとうございます。それが解決策のアプローチでした。 – icordoba

答えて

1

Instance<T>が何をするかです。上記のあなたのサンプルについて

、あなたはどうなる:

`@Inject Instance<MyValidatorInterface> allInstances` 

を、allInstances変数は、与えられたタイプ(MyValidatorInterface)を持っているすべてのあなたの豆が含まれています。修飾子やBeanのクラスに基づいてselect(..)を呼び出すことによって、セットをさらに絞り込むことができます。これにより、もう一度Instanceが返されますが、以前に適合するBeanのサブセットのみが返されます。最後に、get()を呼び出して、Beanインスタンスを取得します。

注:あなたはすぐに(selectなし)上記の場合get()を呼び出す場合は、指定したタイプの2つのBeanがあり、CDIは1が使用されるべきかを決定することができないため、例外が発生します。これは、タイプセーフな解決の規則によって暗示されています。あなたが最も可能性が高いかを知りたい何

Instance<T>Iterableを実装ので、それはあなたが豆を反復するために取得する方法だということです。 https://docs.jboss.org/cdi/api/1.0/:

@Inject 
Instance<MyValidatorInterface> allInstances; 

public void validateAll() { 
    Iterator<MyValidatorInterface> iterator = allInstances.iterator(); 
    while (iterator.hasNext()) { 
    iterator.next().callYourValidationMethod(); 
    }} 
} 
+0

私はそれがとても簡単だとは決して考えなかったでしょう。この方法でコード化され、完璧に動作します。私はちょうど@Namedが共通のインターフェースを継承し、それらはすべてのイテレータに含まれているとの注釈付きクラスを追加します。ありがとう。 – icordoba

+0

うれしい – Siliarus

関連する問題