Es ist derzeit in der Tat etwas verwirrend, da es in Java EE jetzt mehrere Komponentenmodelle gibt. Sie sind CDI , EJB3 und JSF Managed Beans .
CDI ist das neue Kind auf dem Block. CDI Bohnen verfügen dependency injection
, scoping
und ein event bus
. CDI-Bohnen sind in Bezug auf Injektion und Scoping am flexibelsten. Der Eventbus ist sehr leicht und auch für die einfachsten Webanwendungen sehr gut geeignet. Darüber hinaus bietet CDI eine sehr erweiterte Funktion namens " portable extensions
Plug-In " , eine Art Plug-In-Mechanismus, mit dem Anbieter Java EE zusätzliche Funktionen zur Verfügung stellen können, die für alle Implementierungen (Glassfish, JBoss AS, Websphere usw.) verfügbar sind. .
EJB3- Beans wurden aus dem alten EJB2-Komponentenmodell * nachgerüstet und waren die ersten Beans in Java EE, die über eine Anmerkung mit Beans verwaltet wurden. EJB3 Bohnen verfügen dependency injection
, declarative transactions
, declarative security
, pooling
, concurrency control
, asynchronous execution
und remoting
.
Die Abhängigkeitsinjektion in EJB3-Beans ist nicht so flexibel wie in CDI-Beans, und EJB3-Beans haben kein Konzept für das Scoping. EJB3-Beans sind jedoch standardmäßig transaktional und gepoolt ** , zwei sehr nützliche Dinge, die CDI in der Domäne von EJB3 belassen hat. Die anderen genannten Artikel sind auch nicht in CDI verfügbar. EJB3 hat zwar keinen eigenen Ereignisbus, aber einen speziellen Bean-Typ zum Abhören von Nachrichten. die nachrichtengesteuerte Bean. Dies kann verwendet werden, um Nachrichten vom Java Messaging System oder von jedem anderen System mit einem JCA-Ressourcenadapter zu empfangen. Die Verwendung von Messaging für einfache Ereignisse ist weitaus schwerer als der CDI-Ereignisbus, und EJB3 definiert nur einen Listener, keine Produzenten-API.
JSF Managed Beans gibt es in Java EE seit der Aufnahme von JSF. Sie verfügen auch über dependency injection
und scoping
. JSF Managed Beans führte das Konzept des deklarativen Scoping ein. Ursprünglich waren die Bereiche eher begrenzt und in derselben Version von Java EE, in der EJB3-Beans bereits über Anmerkungen deklariert werden konnten, mussten JSF Managed Beans noch in XML deklariert werden. Die aktuelle Version von JSF Managed Beans wird schließlich auch über eine Anmerkung deklariert, und die Bereiche werden um einen Ansichtsbereich und die Möglichkeit zum Erstellen benutzerdefinierter Bereiche erweitert. Der Ansichtsbereich, in dem Daten zwischen Anforderungen auf derselben Seite gespeichert werden, ist eine einzigartige Funktion von JSF Managed Beans.
Abgesehen vom Ansichtsbereich gibt es in Java EE 6 nur noch sehr wenig für JSF Managed Beans. Der fehlende Ansichtsbereich in CDI ist bedauerlich, da CDI sonst ein perfekter Super-Satz dessen gewesen wäre, was JSF Managed Beans bieten. Update : In Java EE 7 / JSF 2.2 wurde ein CDI-kompatibles @ViewScoped hinzugefügt, wodurch CDI in der Tat das perfekte Super-Set ist. Update 2 : In JSF2.3 wurden die von JSF verwalteten Beans zugunsten von von CDI verwalteten Beans veraltet.
Bei EJB3 und CDI ist die Situation nicht so eindeutig. Das EJB3-Komponentenmodell und die API bieten viele Dienste, die CDI nicht bietet. Daher kann EJB3 normalerweise nicht durch CDI ersetzt werden. Auf der anderen Seite kann CDI in Kombination mit EJB3 verwendet werden - z. B. um EJBs eine Bereichsunterstützung hinzuzufügen.
Reza Rahman, Mitglied der Expertengruppe und Implementierer einer CDI-Implementierung namens CanDI, hat häufig angedeutet, dass die mit dem EJB3-Komponentenmodell verbundenen Dienste als eine Reihe von CDI-Anmerkungen nachgerüstet werden können. In diesem Fall könnten alle verwalteten Beans in Java EE zu CDI-Beans werden. Dies bedeutet nicht, dass EJB3 verschwindet oder veraltet ist, sondern nur, dass seine Funktionalität über CDI anstatt über EJBs eigene Anmerkungen wie @Stateless und @EJB verfügbar gemacht wird.
Aktualisieren
David Blevins von TomEE und OpenEJB erklärt die Unterschiede und Ähnlichkeiten zwischen CDI und EJB sehr gut in seinem Blog: CDI, wann die EJBs ausbrechen sollen
* Obwohl es sich nur um eine Erhöhung der Versionsnummer handelt, waren EJB3-Beans größtenteils eine völlig andere Art von Beans: ein einfaches Pojo, das durch Anwenden einer einfachen einzelnen Anmerkung zu einer "verwalteten Bean" wird, im Vergleich zu dem Modell in EJB2, in dem ein Schwergewicht und Für jede Bean war ein übermäßig ausführlicher XML-Bereitstellungsdeskriptor erforderlich. Außerdem musste die Bean verschiedene extrem schwere und größtenteils bedeutungslose Komponentenschnittstellen implementieren.
** Zustandslose Session-Beans werden normalerweise gepoolt, Stateful-Session-Beans normalerweise nicht (aber sie können es sein). Für beide Typen ist das Pooling daher optional, und die EJB-Spezifikation schreibt dies in keiner Weise vor.