Ich habe versucht zu lernen, was EJB
Bohnen sind, was bedeutet das, dass ihre Instanzen in einem Pool verwaltet werden, bla bla. Ich kann sie wirklich nicht gut in den Griff bekommen.
Können Sie mir erklären, was sie wirklich sind (praktisch für einen Java-Programmierer)? Was machen Sie? Welches sind ihre Zwecke? Warum sie wirklich benutzen? (Warum nicht einfach bleiben POJO
?) Vielleicht eine Beispielanwendung?
Bitte beziehen Sie sich nur auf aktualisierte Informationen EJB 3.1
. Datierte Informationen über EJB können irreführend sein.
Für EJB-Anfänger beachten Sie bitte:
EJB basieren auf verteilten Objekten . Dies bezieht sich auf Softwareteile, die auf mehreren Computern (virtuell oder physisch) ausgeführt werden, die über ein Netzwerk verbunden sind .
quelle
Antworten:
Wenn Sie eine Komponente benötigen, die auf die Datenbank zugreift oder auf andere Konnektivitäts- / Verzeichnisressourcen zugreift oder von mehreren Clients aus aufgerufen wird oder als SOA-Dienst gedacht ist, sind EJBs heutzutage normalerweise "größer, stärker, schneller (oder zumindest skalierbarer)". und einfacher "als POJOs. Sie sind am wertvollsten für die Bedienung einer großen Anzahl von Benutzern über das Web oder das Unternehmensnetzwerk und etwas weniger wertvoll für kleine Apps innerhalb einer Abteilung.
Wiederverwenden / Freigeben von Logik für mehrere Anwendungen / Clients mit Loose Coupling.
EJBs können in ihren eigenen Gläsern verpackt, bereitgestellt und von vielen Stellen aus aufgerufen werden. Sie sind gemeinsame Komponenten. Es stimmt, POJOs können (sorgfältig!) Als Bibliotheken entworfen und als Gläser verpackt werden. EJBs unterstützen jedoch sowohl den lokalen als auch den Remote-Netzwerkzugriff - einschließlich der lokalen Java-Schnittstelle, des transparenten RMI, der asynchronen JMS-Nachricht und des SOAP / REST-Webdiensts.
Sie sind sehr nützlich zum Erstellen von SOA-Diensten. Bei Verwendung für den lokalen Zugriff handelt es sich um POJOs (mit zusätzlichen kostenlosen Containerdiensten). Das Entwerfen einer separaten EJB-Schicht fördert die besondere Sorgfalt bei der Maximierung der Kapselung, der losen Kopplung und des Zusammenhalts sowie eine saubere Schnittstelle (Fassade), die Anrufer vor komplexen Verarbeitungs- und Datenmodellen schützt.
Skalierbarkeit und Zuverlässigkeit Wenn Sie eine große Anzahl von Anforderungen von verschiedenen aufrufenden Nachrichten / Prozessen / Threads anwenden, werden diese zuerst auf die verfügbaren EJB-Instanzen im Pool verteilt und dann in die Warteschlange gestellt. Dies bedeutet, dass wenn die Anzahl der eingehenden Anforderungen pro Sekunde größer ist, als der Server verarbeiten kann, wir uns ordnungsgemäß verschlechtern - es werden immer einige Anforderungen effizient verarbeitet und die überschüssigen Anforderungen müssen warten. Wir erreichen keine Server-Kernschmelze - bei der ALLE Anforderungen gleichzeitig eine schreckliche Antwortzeit haben und der Server versucht, auf mehr Ressourcen zuzugreifen, als die Hardware und das Betriebssystem verarbeiten können, und daher abstürzt. EJBs können auf einer separaten Ebene bereitgestellt werden, die geclustert werden kann. Dies bietet Zuverlässigkeit durch Failover von einem Server auf einen anderen. Außerdem kann Hardware hinzugefügt werden, um linear zu skalieren.
Parallelitätsverwaltung. Der Container stellt sicher, dass mehrere Clients automatisch sicher (seriell) auf EJB-Instanzen zugreifen. Der Container verwaltet den EJB-Pool, den Thread-Pool und die Aufrufwarteschlange und führt automatisch Schreibsperren auf Methodenebene (Standard) oder Lesesperren (über @Lock (READ)) durch. Dies schützt Daten vor Beschädigung durch gleichzeitige Schreib- / Schreibkonflikte und hilft beim konsistenten Lesen von Daten, indem Lese- / Schreibkonflikte verhindert werden.
Dies ist hauptsächlich für @ Singleton-Session-Beans nützlich, bei denen die Bean den allgemeinen Status von Client-Anrufern manipuliert und gemeinsam nutzt. Dies kann leicht überschrieben werden, um erweiterte Szenarien für die gleichzeitige Codeausführung und den Datenzugriff manuell zu konfigurieren oder programmgesteuert zu steuern.
Automatisierte Transaktionsabwicklung.
Tun Sie überhaupt nichts und alle Ihre EJB-Methoden werden in einer JTA-Transaktion ausgeführt. Wenn Sie mit JPA oder JDBC auf eine Datenbank zugreifen, wird diese automatisch in die Transaktion aufgenommen. Gleiches gilt für JMS- und JCA-Aufrufe. Geben Sie @TransactionAttribute (someTransactionMode) vor einer Methode an, um anzugeben, ob / wie diese bestimmte Methode an der JTA-Transaktion teilnimmt, und überschreiben Sie dabei den Standardmodus: "Erforderlich".
Sehr einfacher Ressourcen- / Abhängigkeitszugriff über Injektion.
Der Container sucht nach Ressourcen und legt Ressourcenreferenzen als Instanzfelder in der EJB fest: z. B. JNDI-gespeicherte JDBC-Verbindungen, JMS-Verbindungen / Themen / Warteschlangen, andere EJBs, JTA-Transaktionen, Persistenzkontexte für JPA-Entitätsmanager, Factory-Persistenz-Einheiten für JPA-Entitätsmanager und JCA-Adapterressourcen. zB um einen Verweis auf eine andere EJB & eine JTA-Transaktion & einen JPA-Entitätsmanager & eine JMS-Verbindungsfactory und -warteschlange einzurichten:
Ein Servlet kann diese Bean lokal aufrufen, indem es einfach eine Instanzvariable deklariert:
und dann einfach seine 'Methoden wie gewünscht aufrufen.
Intelligente Interaktion mit JPA. Standardmäßig verwendet der wie oben injizierte EntityManager einen transaktionsbezogenen Persistenzkontext. Dies ist perfekt für zustandslose Session Beans. Wenn eine (zustandslose) EJB-Methode aufgerufen wird, wird innerhalb der neuen Transaktion ein neuer Persistenzkontext erstellt. Alle in die Datenbank abgerufenen / geschriebenen Entitätsobjektinstanzen sind nur innerhalb dieses Methodenaufrufs sichtbar und von anderen Methoden isoliert. Wenn jedoch andere zustandslose EJBs von der Methode aufgerufen werden, gibt der Container denselben PC weiter und teilt ihn mit ihnen, sodass dieselben Entitäten in derselben Transaktion automatisch auf konsistente Weise über den PC gemeinsam genutzt werden.
Wenn eine @Stateful-Sitzungs-Bean deklariert wird, wird die gleiche intelligente Affinität zu JPA erreicht, indem der entityManager als erweiterter Bereich deklariert wird: @PersistentContent (unitName = "AccountsPU, type = EXTENDED). Dies gilt für die Lebensdauer der Bean-Sitzung. Über mehrere Bean-Aufrufe und -Transaktionen hinweg werden speicherinterne Kopien von DB-Entitäten zwischengespeichert, die zuvor abgerufen / geschrieben wurden, damit sie nicht erneut abgerufen werden müssen.
Lebenszyklusverwaltung. Der Lebenszyklus von EJBs wird von Containern verwaltet. Bei Bedarf werden EJB-Instanzen erstellt, der Stateful Session Bean-Status gelöscht und initialisiert, Lifecycle-Callback-Methoden passiviert und aktiviert, sodass EJB-Code an Lifecycle-Vorgängen teilnehmen kann, um Ressourcen abzurufen und freizugeben oder ein anderes Initialisierungs- und Herunterfahrverhalten durchzuführen. Außerdem werden alle Ausnahmen erfasst, protokolliert, Transaktionen nach Bedarf zurückgesetzt und nach Bedarf neue EJB-Ausnahmen oder @ApplicationExceptions ausgelöst.
Sicherheitsmanagement. Die rollenbasierte Zugriffssteuerung auf EJBs kann über eine einfache Annotation oder XML-Einstellung konfiguriert werden. Der Server übergibt die authentifizierten Benutzerdetails automatisch zusammen mit jedem Anruf als Sicherheitskontext (aufrufender Principal und Rolle). Es stellt sicher, dass alle RBAC-Regeln automatisch durchgesetzt werden, damit Methoden nicht illegal von der falschen Rolle aufgerufen werden können. Es ermöglicht EJBs den einfachen Zugriff auf Benutzer- / Rollendetails für zusätzliche programmatische Überprüfungen. Es ermöglicht das standardmäßige Einstecken zusätzlicher Sicherheitsverarbeitung (oder sogar IAM-Tools) in den Container.
Standardisierung & Portabilität. EJB-Implementierungen entsprechen den Java EE-Standards und Codierungskonventionen und fördern die Qualität sowie das Verständnis und die Wartung. Es fördert auch die Portabilität von Code auf neue Anbieter-App-Server, indem sichergestellt wird, dass alle dieselben Standardfunktionen und -verhalten unterstützen, und indem Entwickler davon abgehalten werden, versehentlich proprietäre
nicht portable Anbieterfunktionen zu übernehmen.
Der wahre Kicker: Einfachheit. All dies kann mit sehr optimiertem Code ausgeführt werden - entweder mithilfe der Standardeinstellungen für EJBs in Java EE 6 oder durch Hinzufügen einiger Anmerkungen. Coding Unternehmen / Industrie Stärke Funktionen in Ihrem eigenen POJOs wäre Art und Weise mehr volumous, komplex und fehleranfällig. Sobald Sie mit dem Codieren mit EJBs beginnen, sind diese recht einfach zu entwickeln und bieten eine Reihe von Vorteilen für "Freeride".
In der ursprünglichen EJB-Spezifikation von vor 10 Jahren waren EJBs ein großes Produktivitätsproblem. Sie waren aufgebläht, benötigten viele Code- und Konfigurationsartefakte und boten etwa 2/3 der oben genannten Vorteile. Die meisten Webprojekte haben sie nicht verwendet. Dies hat sich jedoch durch 10 Jahre Optimierung, Überarbeitung, Funktionsverbesserung und Optimierung der Entwicklung erheblich geändert. In Java EE 6 bieten sie maximale industrielle Stärke und einfache Bedienung.
Was ist nicht zu mögen? :-) :-)
quelle
Ein EJB ist eine Java-Komponente, die Geschäftslogik enthält, die Sie in einem Container bereitstellen und die dank Anmerkungen in der Regel deklarativ von den vom Container bereitgestellten technischen Diensten profitiert:
quelle
Ich hoffe, dass dies von Oracle Doc jemandem wie mir hilft, das Thema EJB auf einfache Weise zu verstehen.
quelle
Die Frage, die mich am meisten interessiert, ist, wie und wo ich sie verwenden kann. Um dies zu verstehen, müssen wir zuerst sehen, welche Arten von EJBs existieren. Es gibt 2 große Kategorien:
Betrachten wir Session Beans. Sie sind von 3 Arten:
OrderService
. Eine weitere große Verwendung für diese ist die Bereitstellung von Webdiensten. Auch dies kann in der Service-Schicht oder völlig getrennt sein.Configuration
fällt Ihnen die Komponente ein - hier können Sie Konfigurationen auf Anwendungsebene speichern und von überall auf sie zugreifen, wenn Sie sie benötigen.Jetzt können die restlichen Funktionen oder Features in solchen Situationen schichtübergreifend verwendet werden:
Eine große Verwendung in der heutigen Zeit sind die sogenannten Microservices und serviceorientierten Architekturen. Sie können einige Geschäftslogikkomponenten als EJBs verpacken und im gesamten Unternehmen verteilen, um sie von mehreren Clients zu verwenden (mit Client meine ich hier andere Back-End-Anwendungen).
Und so weiter. Der große Nachteil ist nun, dass Sie sehr abhängig vom EJB-Container werden und obwohl Sie zwischen zwei Referenzimplementierungen wechseln können, können Sie nicht zu etwas Leichterem wechseln - zum Beispiel zu Tomcat. Aber warum sollten Sie alle Vorteile opfern wollen?
quelle