CDI-Integration (Contexts and Dependency Injection) mit EJB-Container

Die CDI-Spezifikation erweitert das EJB-Komponentenmodell um das kontextabhängige Lebenszyklusmanagement.

Beziehung der CDI-Spezifikation zur EJB-Spezifikation

Die EJB-Spezifikation definiert ein Programmiermodell für Anwendungskomponenten, die in einer Umgebung mit mehreren Benutzern auf Transaktionsressourcen zugreifen. Problemstellungen, wie z. B. rollenbasierte Sicherheit, Transaktionsabgrenzung, Parallelität und Skalierbarkeit werden deklarativ angegeben, unter Verwendung von Annotationen und XML-Implementierungsdeskriptoren, die vom EJB-Container während der Ausführung umgesetzt werden. EJB-Komponenten können statusabhängig sein, sind aber nicht naturgemäß kontextabhängig.

Folgende Session-Bean-Instanzen werden unter Verwendung der Abhängigkeitsinjektion abgerufen:
  • Kontextabhängige Instanzen
  • Instanzen, die an einen Lebenszyklus gebunden sind
  • Instanzen, die für andere Instanzen verfügbar sind und in diesem Kontext aufgerufen werden
  • Instanzen, die bei Bedarf von einem Container erstellt werden
  • Instanzen, die von einem Container gelöscht werden, wenn ein Kontext beendet wird

Der CDI-Container von WebSphere Application Server Traditional führt die Abhängigkeitsinjektion für alle Session-Bean- und MDB-Instanzen aus, selbst für jene, die keine kontextabhängigen Instanzen sind. WebSphere Application Server CDI unterstützt die Injektion von CDI-Beans in Enterprise-Beans und umgekehrt.

Verwendung

Bewährtes Verfahren Bewährtes Verfahren: Verwenden Sie für die Injektion von Enterprise-Beans die folgenden Methoden: bprac
  • Methode @Inject für kontextabhängige Injektion lokaler Session-Beans verwenden
  • Methode @EJB für Remote-Session-Beans verwenden
Sehen Sie sich die folgenden Beispiele für die Verwendung der Methode "@EJB" in CDI an:

Producer definieren, die die EJB für nicht kontextabhängige Injektion verfügbar machen:

	@Produces @EJB PaymentService paymentService;	
Injizierte Typen in anderen CDI-Beans konsumieren:
@Inject PaymentService myPaymentService

Praktische Hinweise

Sie können CDI-Interceptor mit Interceptor-Bindungen und Decorator-Enterprise-Beans definieren. Interceptor werden mit Methoden vom Typ @Interceptors oder in Dateien vom Typ ejb-jar.xml deklariert, die aufgerufen werden, bevor mit Interceptor-Bindungen deklarierte Interceptor aufgerufen werden. Interceptor werden aufgerufen, bevor Decorator aufgerufen werden.

Wenn eine kontextabhängige @Injected-Instanz eines EJB-Containers gelöscht wird, weil sie ihren Geltungsbereich verlassen hat, und der zugrunde liegende EJB-Container noch nicht durch den direkten Aufruf einer Remove-Methode seitens der Anwendung gelöscht wurde, entfernt der CDI-Container von WebSphere Application Server Traditional die Stateful-Session-Bean.

Der CDI-Container des Produkts entfernt die Stateful-Session-Bean in folgenden Fällen:
  • Sie verwenden die Methode @Inject, um eine kontextabhängige Injektionsinstanz zu erstellen, und diese Instanz in einem EJB-Container wird gelöscht, weil sie ihren Geltungsbereich verlassen hat.
  • Der zugrunde liegende EJB-Container wurde noch nicht durch den direkten Aufruf einer Remove-Methode seitens der Anwendung entfernt.

Sie müssen auch die Weitergabe des Geltungsbereichs und des Status von CDI-Beans berücksichtigen. Die CDI-Beans auf Anforderungs- und Anwendungsebene behalten den Status in ihren jeweiligen Kontexten in den Web-Containern und den EJB-Containern bei. Beispielsweise behält eine CDI-Bean auf Anforderungsebene, die in ein Servlet injiziert wurde, ihren Status bei, wenn eine Geschäftsmethode in einer Stateful-Session-Enterprise-Bean auf diese Bean zugreift.


Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cweb_cdi_ejb
Dateiname:cweb_cdi_ejb.html