web-dev-qa-db-ja.com

プログラムでJava CDIマネージドBeanを(静的)メソッドのローカル変数に挿入する方法

プログラムでJava CDI 1.1+マネージドBeanを静的メソッドのローカル変数に注入するにはどうすればよいですか?

31
XDR

クラスCのインスタンスを注入するには:

javax.enterprise.inject.spi.CDI.current().select(C.class).get()

これはCDI 1.1+で利用可能です

45
XDR

たとえば、このユーティリティ class を使用します。基本的にBeanManagerのインスタンスを取得し、必要なBeanを取得する必要があります(JNDIルックアップのようなものを想像してください)。

更新

[〜#〜] cdi [〜#〜] CDI 1.1で提供されるユーティリティクラスも使用できます。

SomeBean bean = CDI.current().select(SomeBean.class).get();
13
Petr Mensik

@BRS

import javax.enterprise.inject.spi.CDI;

...

IObject iObject = CDI.current().select(IObject.class, new NamedAnnotation("iObject")).get();

と:

import javax.enterprise.util.AnnotationLiteral;

public class NamedAnnotation extends AnnotationLiteral<Named> implements Named {

     private final String value;

     public NamedAnnotation(final String value) {
         this.value = value;
     }

     public String value() {
        return value;
    }
}
8
XDR

@Petr Mensikによって提案されたリンクは非常に便利です。私の例では同じコードを使用しています。

インスタンスメソッド/静的メソッドでクラスのインスタンスを取得する方法を次に示します。メソッドでハードコードされたクラス名を使用するよりも、常にインターフェイスをコーディングする方が適切です。

@Named(value = "iObject ")
@RequestScoped
class IObjectImpl  implements IObject  {.....}

//And in your method

IObject iObject = (IObject) ProgrammaticBeanLookup.lookup("iObject");
.........
//Invoke methods defined in the interface

このプログラムによるBeanのルックアップは、時間の経過とともに変化する可能性のあるクラスのインスタンスを必要とするメソッドを持つアプリケーションスコープオブジェクトがある場合に非常に役立ちます。そのため、インターフェイスを抽出し、疎結合のためにプログラムBeanルックアップを使用することを常にお勧めします。

2
phoenix

修飾子を含める必要があります。

List<Annotation> qualifierList = new ArrayList();
 for (Annotation annotation: C.class.getAnnotations()) {
   if (annotation.annotationType().isAnnotationPresent(Qualifier.class)) {
     qualifierList.add(annotation);
   }
 }
javax.enterprise.inject.spi.CDI.current()
   .select(C.class, qualifierList.toArray(new Annotation[qualifierList.size()])
   .get()
  • 静的メソッドでBeanインターフェースのタイプを使用してパラメーターを定義し、適切な実装参照を渡すことができます。そうすれば、ユニットテストがより使いやすくなります。
  • Apache Deltaspike を使用している場合、 BeanProvider#getContextualReference を使用できます。 javax.enterprise.inject.Instanceを取得するよりも簡単ですが、依存するBeanに注意してください(javadocを参照)!
0
jpangamarca