EJB 3.1 @LocalBean vs keine Anmerkung

77

Ich verstehe den Unterschied zwischen lokaler Ansicht, Remote-Ansicht und Ansicht ohne Schnittstelle. Ich verstehe einfach nicht, was der Unterschied zwischen "keine Ansicht" (keine Anmerkung) und Ansicht ohne Schnittstelle ist. Und warum sollte ich meine Benutzeroberfläche mit Anmerkungen versehen @Local? Was ist, wenn ich die Benutzeroberfläche überhaupt nicht kommentiere? Gibt es einen Unterschied?

VaclavDedik
quelle
Was für eine EJB-Bohne würde es werden, wenn Sie nicht alles mit Anmerkungen versehen? Oder anders ausgedrückt: Wie würde der Container wissen, ob eine Klasse ein POJO oder eine SessionBean ist?
Esej
2
@esej Sie kommentieren es mit der Annotation Stateless, Stateful oder Singleton und dann entweder mit der Annotation Local, Remote oder LocalBean oder Sie kommentieren es nicht mit dieser Art von Annotation. Der Container weiß also, ob eine Klasse eine SessionBean ist, wenn Sie sie mit Annotation ohne Status, Status oder Singleton versehen.
VaclavDedik
Richtig. (Früher habe ich nicht gesehen, was Sie für einen Unterschied gehalten haben, jetzt bin ich klüger geworden (weil ich eine seltsame Idee hatte).)
esej
Ich denke, das Fehlen einer Anmerkung impliziert eine Ansicht ohne Schnittstelle. Es gibt also keinen Unterschied zwischen "keine Ansicht" und einer Ansicht ohne Benutzeroberfläche!
Tom Anderson

Antworten:

139

Die Regeln sind (aus dem Speicher):

  1. Bean hat eine @LocalBeanAnmerkung -> Bean hat eine Ansicht ohne Schnittstelle
  2. Bean hat eine @LocalAnmerkung -> Bean hat eine lokale Ansicht
  3. Bean hat eine @RemoteAnmerkung -> Bean hat eine Fernansicht
  4. Bean hat keine Ansichtsanmerkungen, implementiert jedoch direkt eine Schnittstelle mit einer @ lokalen Annotation -> Bean hat eine lokale Ansicht
  5. Bean hat keine Ansichtsanmerkungen, implementiert jedoch direkt eine Schnittstelle mit einer @ Remote-Anmerkung -> Bean hat eine Remote-Ansicht
  6. Bean hat keine Ansichtsanmerkungen, implementiert jedoch direkt eine Schnittstelle, die keine Ansichtsanmerkungen enthält -> Bean hat eine lokale Ansicht
  7. Bean hat keine Ansichtsanmerkungen und implementiert keine Schnittstellen -> Bean hat eine Ansicht ohne Schnittstelle

Die Verwendung @LocalBeanund Verwendung von überhaupt keinen Anmerkungen sind also beide Möglichkeiten, eine Ansicht ohne Schnittstelle zu erhalten. Wenn Sie nur eine Ansicht ohne Benutzeroberfläche wünschen, ist es am einfachsten, keine Anmerkungen zu machen. Vorausgesetzt, Sie implementieren keine Schnittstellen.

Ein Teil des Grundes @LocalBeanbesteht darin, einer Bean, die auch eine Schnittstellenansicht hat, eine Ansicht ohne Schnittstelle hinzuzufügen. Ich stelle mir vor, das Szenario, das in den Köpfen der Spezifikationsautoren an erster Stelle stand, war eines, in dem Sie eine Bohne haben wie:

@Stateless
public class UserPreferences {
    public String getPreference(String preferenceName);
    public Map<String, String> getPreferences();
}

Wo Sie beide Methoden lokal verfügbar machen möchten, aber nur die gröberkörnigen aus der getPreferences()Ferne. Sie können dies tun, indem Sie eine Remote-Schnittstelle mit genau dieser Methode deklarieren und dann einfach @LocalBeanauf die Bean-Klasse klatschen. Ohne sie müssten Sie eine sinnlose lokale Schnittstelle schreiben, um beide Methoden lokal verfügbar zu machen.

Oder anders ausgedrückt: Das ist @LocalBeanvorhanden, weil es so etwas wie eine Ansicht ohne Benutzeroberfläche gibt und die Option ohne Anmerkungen als praktische Verknüpfung vorhanden ist.

Tom Anderson
quelle
9
Die genauen Regeln finden Sie in Abschnitt 4.9.7 der EJB 3.1-Spezifikation. Sie sind etwas komplizierter als das, was Sie präsentieren (Homes, Webservices, Ausschlüsse der Schnittstelle java.io/javax.ejb), aber dies ist eine schöne Zusammenfassung.
Brett Kail
@bkail: Danke für den Hinweis. Ich habe keine Kopie der Spezifikation zur Hand, und die Website von Oracle kam zum Stillstand, als ich versuchte, eine herunterzuladen, sodass ich sie nicht überprüfen konnte. Ich habe erkannt, dass dies ein Bereich ist, über den ich mich informieren muss!
Tom Anderson
Wie ich es verstehe. Ist POJO eine LocalBean?
Bitli
@bitli: Wenn das POJO keine Schnittstellen implementiert und keine Anmerkungen hat, hat es eine Ansicht ohne Schnittstelle, so als ob es mit Anmerkungen versehen wäre @LocalBean.
Tom Anderson
16
  • Remote-EJBs: können von Remote-Clients aus aufgerufen werden (Clients, die auf einer anderen JVM ausgeführt werden, z. B. Swing- oder JavaFX-Clients, die auf dem Benutzercomputer ausgeführt werden).
  • Lokale EJBs: Der Zugriff kann nur von anderen "Komponenten" erfolgen, die auf derselben JVM ausgeführt werden, z. B. Web-Frontends oder anderen EJBs
  • Ansicht ohne Schnittstelle: Wie Lokal, jedoch ohne Angabe der Geschäftsschnittstelle
  • Keine Anmerkung: ein einfaches POJO, aber kein EJB

Lokale Ansichten / Ansichten ohne Schnittstelle sind effizienter als Remote-EJBs, da Objektreferenzen weitergegeben werden können.

Puce
quelle
2
Ich dachte, dass ein POJO zu EJB wird, wenn Sie es mit Stateless-, Statefull- oder Singleton-Annotation versehen. Vermisse ich etwas
VaclavDedik
1
@Puce, Sie sagten "Keine Anmerkung: ein einfaches POJO, aber kein EJB", was Tom Andersons Kommentar widerspricht. "Wenn das POJO keine Schnittstellen implementiert und keine Anmerkungen enthält, hat es eine Ansicht ohne Schnittstelle, als ob es wurde mit @LocalBean "kommentiert. Könntest Du das erläutern?
Bigfoot
6

Ich denke, dass die Verwirrung, die Sie / wir empfinden, ein Ergebnis der Geschichte / Rückwärtskompatibilität ist (sozusagen). Ich kann keinen Unterschied feststellen (außer dass die Spezifikation Implementierungen erfordert, um eine Schnittstelle zu erstellen, wenn wir die lokale Ansicht verwenden).

Die Ansicht ohne Schnittstelle hat dasselbe Verhalten wie die lokale Ansicht von EJB 3.0. Sie unterstützt beispielsweise Funktionen wie die Semantik von Pass-by-Reference-Aufrufen sowie die Weitergabe von Transaktionen und Sicherheit. Für eine Ansicht ohne Schnittstelle ist jedoch keine separate Schnittstelle erforderlich. Das heißt, alle öffentlichen Methoden der Bean-Klasse werden dem Aufrufer automatisch zur Verfügung gestellt. Standardmäßig macht jede Session-Bean, die eine leere Implementierungsklausel enthält und keine anderen lokalen oder Remote-Client-Ansichten definiert, eine Client-Ansicht ohne Schnittstelle verfügbar.

Oracle Blog vor der Veröffentlichung von EJB 3.1

esej
quelle
0

Wenn Sie an weiteren technischen Details interessiert sind, lassen Sie mich sagen, was wirklich los ist. Sie haben keinen direkten Zugriff auf das EJB-Objekt. Dies bedeutet, dass Sie nicht über die Referenz (Adresse) des tatsächlichen EJB-Objekts verfügen. Wenn Sie Ihre EJB suchen oder injizieren, stellt der Container ein Objekt als Client für diese EJB bereit (wir können Proxy oder Wrapper aufrufen), und Sie rufen Ihre Geschäftsmethoden für dieses Proxy-Objekt auf. (Deshalb sollten Sie kein neues Schlüsselwort verwenden, um ein Objekt der EJB-Klasse zu erstellen.)

Jetzt generiert der Container für jeden Annotationstyp unterschiedliche Proxy-Typen mit unterschiedlichen Methoden und Funktionen.

@LocalBean (oder keine Anmerkung) Ihr Proxy-Objekt hat:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local Ihr Proxy-Objekt verwendet den lokalen Aufruf und den Typ von com.sun.proxySo hat es:

  • getSerializableObjectFactory()
  • isProxyClass()
  • getProxyClass()
  • getInvocationHandler()
  • newProxyInstance()

@Remote Ihr Wrapper-Objekt verwendet einen Fernaufruf und hat:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()
A. Parvini
quelle