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.
- 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

- Methode @Inject für kontextabhängige Injektion lokaler Session-Beans verwenden
- Methode @EJB für Remote-Session-Beans verwenden
Producer definieren, die die EJB für nicht kontextabhängige Injektion verfügbar machen:
@Produces @EJB PaymentService paymentService;
@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.
- 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.