プログラムでJava CDI 1.1+マネージドBeanを静的メソッドのローカル変数に注入するにはどうすればよいですか?
クラスC
のインスタンスを注入するには:
javax.enterprise.inject.spi.CDI.current().select(C.class).get()
これはCDI 1.1+で利用可能です
たとえば、このユーティリティ class を使用します。基本的にBeanManager
のインスタンスを取得し、必要なBeanを取得する必要があります(JNDIルックアップのようなものを想像してください)。
更新
[〜#〜] cdi [〜#〜] CDI 1.1で提供されるユーティリティクラスも使用できます。
SomeBean bean = CDI.current().select(SomeBean.class).get();
@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;
}
}
@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ルックアップを使用することを常にお勧めします。
修飾子を含める必要があります。
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()