web-dev-qa-db-de.com

Wie programmgesteuert ein Java CDI Managed Bean in eine lokale Variable in einer statischen Methode eingefügt wird

Wie kann ich in einer statischen Methode eine verwaltete Java CDI 1.1+-Bean in eine lokale Variable programmieren?

28
XDR

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

41
XDR

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();
13
Petr Mensik

@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;
    }
}
7
XDR

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.

2
phoenix

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()
  • Sie können einen Parameter mit dem Typ des Bean-Interfaces in Ihrer statischen Methode definieren und eine entsprechende Implementierungsreferenz übergeben .____. Dies würde den Test für Unit-Tests erleichtern.
  • Wenn Sie Apache Deltaspike verwenden, können Sie BeanProvider # getContextualReference verwenden. Es ist einfacher als eine javax.enterprise.inject.Instance zu bekommen, aber hüten Sie sich vor abhängigen Beans (siehe Javadoc)!
0
jpangamarca