Manueller CDI Lookup


Normalerweise läßt man sich CDI Beans direkt injecten. Das geschieht über die Annotation @Inject. Es gibt aber Begebenheiten, wo eine CDI Bean referenziert werden soll, aber ein Inject nicht möglich ist. Dies ist beispielweise der Fall, wenn die CDI Bean in einer Nicht-CDI Bean verfügbar gemacht werden soll.
Um trotzdem an die CDI Bean zu kommen, bedient man sich des BeanManagers. Je nach verwenderter CDI Version stehen uns drei Möglichkeiten zum Holen des BeanManagers offen.

Ab CDI 1.1 steht das CDI-Objekt zur Verfügung (Referenz):
BeanManager beanManager = CDI.current().getBeanManager();
Hier wird die CDI Instanz geholt, mit der direkt auf den CDI Container zugegriffen werden kann.

Bei Verwendung einer CDI Version <1.1 funktioniert nur der Weg über einen geeigneten Context oder JNDI.
Der Zugriff über den FacesContext von JSF funktioniert beispielsweise wie folgt:
import javax.enterprise.inject.spi.BeanManager;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

BeanManager beanManager = (BeanManager) ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()).getAttribute("javax.enterprise.inject.spi.BeanManager");

Der Zugriff über JNDI funktioniert so:
BeanManager beanManager = null;
try {
  InitialContext context = new InitialContext();
  beanManager = (BeanManager) context.lookup("java:comp/BeanManager");
} catch (Exception e) {
  e.printStackTrace();
}

Nachdem der BeanManager zur Verfügung steht, kann mit einem Lookup nach der gewünschten CDI Bean gesucht werden. Zum Beispiel wird die CDI Bean SecurityService gesucht.
Der typbasierte Lookup sieht wie folgt aus:
Bean bean = (Bean) beanManager.getBeans(SecurityService.class).iterator().next();
CreationalContext ctx = beanManager.createCreationalContext(bean);
SecurityService dao = (SecurityService) beanManager.getReference(bean, SecurityService.class, ctx);

Der namenbasierte Lookup sieht so aus:
public Object getBeanByName(String name) {
  BeanManager beanManager = getBeanManager();
  Bean bean = beanManager.getBeans(name).iterator().next();
  CreationalContext ctx = beanManager.createCreationalContext(bean); 
  Object obj = beanManager.getReference(bean, bean.getBeanClass(), ctx);
  return obj;
}

In einer CDI-Umgebung hingegen, wird der BeanManager einfach injected:
@Inject
BeanManager beanManager;
Eine mögliche Variante zum Holen aller CDI-Beans könnte so aussehen:
import javax.enterprise.inject.Any;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.util.AnnotationLiteral;

BeanManager beanManager = getBeanManager();
Set> beans = beanManager.getBeans(Object.class,new AnnotationLiteral() {}));
for (Bean bean : beans) {
  System.out.println(bean.getBeanClass().getName());
}
Tags: CDI, BeanManager, Lookup
Guido Oelmann     Mittwoch, 20. April 2016 0    1248
@
(Email Adresse wird nicht veröffentlicht)
(kein HTML erlaubt)
Bitte beantworten Sie die einfache mathematische Frage.
  


Keine Kommentare vorhanden.