EJB-Grundlagen und Session Beans

Java Enterprise Edition (Java EE) verfügt über eine leistungsstarke Funktion zum Ausdrücken der Geschäftslogik einer Anwendung und zum Zugreifen auf eine Datenbank mithilfe eines JavaBeans-ähnlichen Konzepts. Diese Funktion ist Enterprise JavaBeans , kurz EJBs genannt.

In diesem Artikel werden wir uns mit der Welt der EJBs befassen, die eine sehr wichtige Funktion der Java EE-Plattform darstellt. EJBs bieten eine Infrastruktur für die Entwicklung und Bereitstellung geschäftskritischer Unternehmensanwendungen. Wir werden uns zunächst einige EJB-Grundlagen ansehen und uns dann auf eine Art von EJB konzentrieren: die Session Bean.

In diesem Artikel erfahren Sie Folgendes:

  • Die Vorteile der Verwendung von EJBs
  • Die drei Arten von EJBs: Sitzungs-, Entitäts- und nachrichtengesteuerte Beans
  • Das Make-up von Session Beans
  • So entwickeln Sie Session Beans
  • Unterschiede zwischen zustandsbehafteten und zustandslosen Session Beans

EJBs verstehen

Anwendungsarchitekturen bestehen häufig aus mehreren Ebenen, von denen jede ihre eigenen Verantwortlichkeiten hat. Eine solche Architektur, die aus drei Ebenen besteht, ist in dem in Abbildung 1 gezeigten UML-Diagramm (Unified Modeling Language) dargestellt.

Die beiden Elemente auf der linken Seite des Diagramms in Abbildung 1 werden in der UML-Notation als Komponenten bezeichnet . Komponenten repräsentieren Softwaremodule. Das Diagramm beschreibt eine sogenannte mehrschichtige oder geschichtete Architektur. Mehrschichtige Architekturen haben viele Vorteile, nicht zuletzt die Möglichkeit, eine der Schichten zu ändern, ohne alle anderen Schichten zu beeinflussen. Dies steht im Gegensatz zu einer einstufigen Architektur, in der alle Aspekte des Programmdesigns in einem einzigen Element koexistieren. Änderungen oder Aktionen, die einen Teil des einstufigen Elements betreffen, wirken sich möglicherweise auch auf die anderen Mitglieder dieses Elements aus.

Betrachten Sie die in Abbildung 1 gezeigte dreischichtige Architektur, die aus Benutzeroberfläche, Anwendungslogik und Datenbankebenen besteht. Wenn die Datenbankschicht geändert wird, ist nur die Anwendungslogikschicht betroffen. Die Anwendungslogikschicht schützt die Benutzeroberflächenschicht vor Änderungen an der Datenbankschicht. Dies erleichtert die fortlaufende Wartung der Anwendung und erhöht auch die Fähigkeit der Anwendung, neue Technologien in ihre Schichten zu integrieren.

Diese Ebenen bieten ein hervorragendes Modell dafür, wie EJBs in Ihr gesamtes Programmdesign passen. EJBs bieten eine Anwendungslogikschicht und eine JavaBeans-ähnliche Abstraktion der Datenbankschicht. Die Anwendungslogikschicht wird auch als mittlere Schicht bezeichnet .

Hinweis
JavaBeans und Enterprise JavaBeans sind zwei verschiedene Dinge, aber aufgrund ihrer Ähnlichkeiten (und aus Marketinggründen) haben sie einen gemeinsamen Namen. JavaBeans sind in Java erstellte Komponenten, die auf jeder Ebene einer Anwendung verwendet werden können. Sie werden häufig in Bezug auf Servlets und als GUI-Komponenten betrachtet. Enterprise JavaBeans sind spezielle, serverbasierte Komponenten, mit denen die Geschäftslogik und die Datenzugriffsfunktionen einer Anwendung erstellt werden.

Warum EJBs verwenden?

Vor nicht allzu langer Zeit, als Systementwickler eine Unternehmensanwendung erstellen wollten, begannen sie häufig damit, ihren eigenen (oder einen proprietären) Anwendungsserver zu rollen, um die Funktionalität der Anwendungslogikschicht zu unterstützen. Einige der Funktionen eines Anwendungsservers umfassen Folgendes:

  • Client-Kommunikation: Der Client, bei dem es sich häufig um eine Benutzeroberfläche handelt, muss in der Lage sein, die Methoden von Objekten auf dem Anwendungsserver über vereinbarte Protokolle aufzurufen.
  • Sitzungsstatusverwaltung: Sie werden sich an unsere Diskussionen zu diesem Thema im Zusammenhang mit der Entwicklung von JSP (JavaServer Pages) und Servlets in Kapitel 6 erinnern.
  • Transaktionsmanagement: Einige Vorgänge, z. B. beim Aktualisieren von Daten, müssen als Arbeitseinheit ausgeführt werden. Wenn ein Update fehlschlägt, sollten alle fehlschlagen.
  • Datenbankverbindungsverwaltung: Ein Anwendungsserver muss eine Verbindung zu einer Datenbank herstellen und häufig Pools von Datenbankverbindungen zur Optimierung von Ressourcen verwenden.
  • Benutzerauthentifizierung und rollenbasierte Autorisierung: Benutzer einer Anwendung müssen sich häufig aus Sicherheitsgründen anmelden. Die Funktionalität einer Anwendung, auf die ein Benutzer Zugriff hat, basiert häufig auf der Rolle, die einer Benutzer-ID zugeordnet ist.
  • Asynchrones Messaging: Anwendungen müssen häufig asynchron mit anderen Systemen kommunizieren. Das heißt, ohne darauf zu warten, dass das andere System antwortet. Dies erfordert ein zugrunde liegendes Nachrichtensystem, das die garantierte Zustellung dieser asynchronen Nachrichten ermöglicht.
  • Anwendungsserververwaltung: Anwendungsserver müssen verwaltet werden. Zum Beispiel müssen sie überwacht und abgestimmt werden.

Die EJB-Spezifikation

Die EJB-Spezifikation definiert eine gemeinsame Architektur, die mehrere Anbieter dazu veranlasst hat, Anwendungsserver zu erstellen, die dieser Spezifikation entsprechen. Jetzt können Entwickler Standard-Anwendungsserver erhalten, die einem gemeinsamen Standard entsprechen und von der Konkurrenz (in Bereichen wie Preis, Funktionen und Leistung) dieser Anbieter profitieren.

Einige der gängigsten kommerziellen EJB-Anwendungsserver sind WebLogic (BEA), Java Enterprise System (Sun), OC4J-Container für Oracle Database 10g und WebSphere (IBM). Es gibt auch einige sehr gute Open Source-Einträge in diesem Markt wie JBoss und JOnAS. Sun bietet auch eine Open Source-Referenzimplementierung (Java EE SDK) der Java EE 5- und EJB 3.0-Spezifikationen, mit der Entwickler Anwendungen entwickeln und testen können, um die Einhaltung dieser Spezifikationen zu gewährleisten. (Die Referenzimplementierung darf jedoch nicht zum Bereitstellen von Produktionssystemen verwendet werden.) Derzeit wird die Referenzimplementierung mit dem Codenamen "Glassfish" entwickelt. Die Plattform bietet eine grundlegende EJB 3.0-Testplattform. Weitere Details finden Sie auf der Website und in den zugehörigen Diskussionsforen. Diese Anwendungsserver,Unterstützen Sie in Verbindung mit den in der EJB-Spezifikation definierten Funktionen alle hier aufgeführten und viele weitere Funktionen.

Die EJB-Spezifikation wurde von erfahrenen Mitgliedern der Entwicklungsgemeinschaft erstellt. Ein solches Gremium wird als Expertengruppe bezeichnet. In der Expertengruppe der EJB-Spezifikation befinden sich Mitglieder von Organisationen wie JBoss, Oracle und Google. Dank ihnen haben wir jetzt eine standardmäßige, spezifikationsbasierte Möglichkeit, Systeme der Enterprise-Klasse zu entwickeln und bereitzustellen. Wir nähern uns dem Java-Traum, eine Anwendung zu entwickeln, die unverändert auf jeder Anbieterplattform ausgeführt werden kann. Dies steht im Gegensatz zu der herstellerspezifischen Art der Entwicklung, bei der jeder Server seine eigene Vorgehensweise hatte und bei der der Entwickler nach dem Schreiben der ersten Codezeile an die ausgewählte Plattform gebunden war!

Die Version der EJB-Spezifikation, die in der Java EE 5.0-Empfehlung enthalten ist, ist 3.0. Dies ist die Version, auf die wir uns bei der Erörterung von EJBs beziehen. Die EJB 3.0-Spezifikation hat gegenüber ihrem Vorgänger (Version 2.1, die Teil der J2EE 1.4-Empfehlung war) viele Verbesserungen hinzugefügt, darunter Metadatenanmerkungen zur Vereinfachung von Bereitstellungsproblemen, ein höheres Maß an Kontrolle über die Persistenz von Beans und eine wesentlich vereinfachte (aber nicht weniger leistungsfähiges Programmiermodell für die Entwicklung von EJBs.

Die drei Arten von EJBs

Es gibt tatsächlich drei Arten von EJBs: Session-Beans, Entity-Beans und nachrichtengesteuerte Beans. Hier präsentieren wir eine kurze Einführung zu jeder Bohnensorte. Der Rest dieses Artikels konzentriert sich dann auf Session Beans.

Hinweis
Wenn wir uns auf EJBs im allgemeinen Sinne beziehen, verwenden wir den Begriff EJBs , Enterprise-Beans oder einfach Beans .

Session Beans

Eine Möglichkeit, über die Anwendungslogikschicht (mittlere Schicht) in der in Abbildung 1 gezeigten Beispielarchitektur nachzudenken, besteht aus einer Reihe von Objekten, die zusammen die Geschäftslogik einer Anwendung implementieren. Session Beans sind das Konstrukt in EJBs, die für diesen Zweck entwickelt wurden. Wie in Abbildung 2 dargestellt, kann eine Anwendung mehrere Session Beans enthalten. Jeder behandelt eine Teilmenge der Geschäftslogik der Anwendung.

Eine Session-Bean ist in der Regel für eine Gruppe verwandter Funktionen verantwortlich. Beispielsweise kann eine Anwendung für eine Bildungseinrichtung eine Session-Bean enthalten, deren Methoden Logik für den Umgang mit Schülerdatensätzen enthalten. Eine andere Session-Bean enthält möglicherweise eine Logik, die die Listen der an dieser Institution verfügbaren Kurse und Programme verwaltet.

Es gibt zwei Arten von Session Beans, die durch ihre Verwendung in einer Clientinteraktion definiert werden:

  • Statuslos: Diese Beans deklarieren keine Instanzvariablen (auf Klassenebene), sodass die darin enthaltenen Methoden nur auf lokale Parameter einwirken können. Es gibt keine Möglichkeit, den Status über Methodenaufrufe hinweg aufrechtzuerhalten.
  • Stateful: Diese Beans können den Clientstatus über Methodenaufrufe hinweg halten. Dies ist mit der Verwendung von Instanzvariablen möglich, die in der Klassendefinition deklariert sind. Der Client legt dann die Werte für diese Variablen fest und verwendet diese Werte in anderen Methodenaufrufen.

Der Server muss möglicherweise mehr Arbeit für die Freigabe von Stateful Session Beans aufwenden, als für die Freigabe von zustandslosen Beans erforderlich ist. Das Speichern des Status eines EJB ist ein sehr ressourcenintensiver Prozess, sodass eine Anwendung, die Stateful Beans verwendet, möglicherweise nicht einfach skalierbar ist. Stateless Session Beans bieten eine hervorragende Skalierbarkeit, da der EJB-Container ihren Status nicht über Methodenaufrufe hinweg verfolgen muss. Sie werden später in diesem Artikel erfahren, wie Sie sowohl zustandslose als auch zustandsbehaftete Session-Beans entwickeln.

Alle EJBs, einschließlich Session Beans, arbeiten im Kontext eines EJB-Servers, wie in Abbildung 2 dargestellt. Ein EJB-Server enthält Konstrukte, sogenannte EJB-Container, die für die Bereitstellung einer Betriebsumgebung für die Verwaltung und Bereitstellung von Diensten für die EJBs verantwortlich sind darin laufen.

In einem typischen Szenario ruft die Benutzeroberfläche einer Anwendung die Methoden der Session Beans auf, da sie die von ihnen bereitgestellten Funktionen erfordern. Session Beans können andere Session Beans und Entity Beans aufrufen. Abbildung 2 zeigt typische Interaktionen zwischen der Benutzeroberfläche, Session Beans, Entity Beans und der Datenbank.

Entity Beans

Bevor die Objektorientierung populär wurde, wurden Programme normalerweise in prozeduralen Sprachen geschrieben und verwendeten häufig relationale Datenbanken, um die Daten zu speichern. Aufgrund der Stärken und der Reife der relationalen Datenbanktechnologie ist es heute häufig vorteilhaft, objektorientierte Anwendungen zu entwickeln, die relationale Datenbanken verwenden. Das Problem bei diesem Ansatz besteht darin, dass es einen inhärenten Unterschied zwischen objektorientierten und relationalen Datenbanktechnologien gibt, so dass es für sie weniger selbstverständlich ist, in einer Anwendung nebeneinander zu existieren. Die Verwendung von Entity Beans ist aus folgenden Gründen eine Möglichkeit, das Beste aus beiden Welten herauszuholen:

  • Entity Beans sind Objekte und können nach objektorientierten Prinzipien entworfen und in Anwendungen als Objekte verwendet werden.
  • Die Daten in diesen Entity-Bean-Objekten bleiben in einem Datenspeicher erhalten, normalerweise in relationalen Datenbanken. Alle Vorteile relationaler Technologien - einschließlich Produktreife, Geschwindigkeit, Zuverlässigkeit, Wiederherstellungsfähigkeit und einfache Abfrage - können genutzt werden.

In einem typischen EJB-Szenario ruft eine Session-Bean die Methoden einer Entity-Bean auf, wenn sie auf Daten zugreifen muss. Entity Beans repräsentieren die persistenten Daten in einer EJB-Anwendung. Beispielsweise kann eine Anwendung für eine Bildungseinrichtung eine Entity-Bean mit dem Namen haben Student, die eine Instanz für jeden Studenten hat, der an einer Einrichtung eingeschrieben ist. Entity Beans, die häufig von einer relationalen Datenbank unterstützt werden, lesen und schreiben in Tabellen in der Datenbank. Aus diesem Grund bieten sie eine objektorientierte Abstraktion für einen Informationsspeicher.

Wie in Abbildung 2 dargestellt, empfiehlt es sich, nur Session-Beans direkt vom Client aufzurufen und die Session-Beans die Entity-Beans aufrufen zu lassen. Hier sind einige Gründe dafür:

  • Diese Vorgehensweise umgeht nicht die in den Session Beans enthaltene Geschäftslogik. Das direkte Aufrufen von Entity-Beans führt dazu, dass die Geschäftslogik in die UI-Logik verschoben wird, was normalerweise eine schlechte Sache ist.
  • Die Benutzeroberfläche muss nicht so stark von Änderungen an den Entity-Beans abhängig sein. Die Benutzeroberfläche ist durch die Session Beans vor diesen Änderungen geschützt.
  • Damit ein Client mit einer Bean auf dem EJB-Server interagieren kann, muss ein Remote-Verweis auf die Bean vorhanden sein, die Ressourcen beansprucht. In einer Anwendung gibt es tendenziell weit mehr (Größenordnungen) Entity-Bean-Instanzen als Session-Bean-Instanzen. Durch das Einschränken des Clientzugriffs auf Session Beans werden Server- und Netzwerkressourcen erheblich geschont.
Hinweis
Für die Entwicklung von Entity Beans ist keine Geschäftsschnittstelle erforderlich. Tatsächlich sind nachrichtengesteuerte Beans die einzigen EJBs, die eine Geschäftsschnittstelle implementieren müssen.

Nachrichtengesteuerte Bohnen

Wenn eine EJB-basierte Anwendung asynchrone Nachrichten von anderen Systemen empfangen muss, kann sie die Leistung und den Komfort von nachrichtengesteuerten Beans nutzen. Asynchrone Nachrichten zwischen Systemen können analog zu den Ereignissen sein, die von einer UI-Komponente an einen Ereignishandler in derselben JVM ausgelöst werden. Im B2B-Bereich (Business-to-Business) kann ein Großhändler beispielsweise über eine EJB-Anwendung verfügen, die nachrichtengesteuerte Beans verwendet, um auf Bestellungen zu warten, die elektronisch von Einzelhändlern ausgestellt wurden.

Welche Art von EJB sollten Sie verwenden?

Wie entscheiden Sie also, ob eine bestimmte EJB eine Session-Bean, eine Entity-Bean oder eine nachrichtengesteuerte Bean sein soll? Hier sind einige Richtlinien für die Entscheidung: