Wie kann ich in einer statischen Methode eine verwaltete Java CDI 1.1+-Bean in eine lokale Variable programmieren?
So fügen Sie eine Instanz der Klasse C
ein:
javax.enterprise.inject.spi.CDI.current().select(C.class).get()
Dies ist in CDI 1.1+ verfügbar
Verwenden Sie beispielsweise dieses Dienstprogramm class . Sie müssen im Grunde eine Instanz von BeanManager
erhalten und dann die gewünschte Bean daraus ziehen (stellen Sie sich so etwas wie eine JNDI-Suche vor).
Update
Sie können auch die in CDI 1.1 angebotene CDI utility-Klasse verwenden
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();
Mit:
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;
}
}
Der von @Petr Mensik vorgeschlagene Link ist sehr nützlich. Ich verwende den gleichen Code in meinem Beispiel.
Es gibt eine Möglichkeit, eine Instanz der Klasse in Instanzmethoden/statischen Methoden abzurufen. Es ist immer besser, für Schnittstellen zu codieren, anstatt den in den Methoden fest codierten Klassennamen zu verwenden.
@Named(value = "iObject ")
@RequestScoped
class IObjectImpl implements IObject {.....}
//And in your method
IObject iObject = (IObject) ProgrammaticBeanLookup.lookup("iObject");
.........
//Invoke methods defined in the interface
Diese programmatische Suche nach Beans kann sehr nützlich sein, wenn Sie ein Objekt mit Anwendungsbereich haben, dessen Methode eine Instanz einer Klasse erfordert, die sich im Laufe der Zeit ändern kann. Daher ist es immer besser, die Schnittstelle zu extrahieren und programmatische Bean-Look-Ups für lose Kopplung zu verwenden.
Sie sollten Qualifikatoren enthalten:
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()