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?
java
jakarta-ee
ejb
VaclavDedik
quelle
quelle
Antworten:
Die Regeln sind (aus dem Speicher):
@LocalBean
Anmerkung -> Bean hat eine Ansicht ohne Schnittstelle@Local
Anmerkung -> Bean hat eine lokale Ansicht@Remote
Anmerkung -> Bean hat eine FernansichtDie Verwendung
@LocalBean
und 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
@LocalBean
besteht 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@LocalBean
auf 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
@LocalBean
vorhanden, weil es so etwas wie eine Ansicht ohne Benutzeroberfläche gibt und die Option ohne Anmerkungen als praktische Verknüpfung vorhanden ist.quelle
@LocalBean
.Lokale Ansichten / Ansichten ohne Schnittstelle sind effizienter als Remote-EJBs, da Objektreferenzen weitergegeben werden können.
quelle
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).
Oracle Blog vor der Veröffentlichung von EJB 3.1
quelle
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 voncom.sun.proxy
So hat es:getSerializableObjectFactory()
isProxyClass()
getProxyClass()
getInvocationHandler()
newProxyInstance()
@Remote
Ihr Wrapper-Objekt verwendet einen Fernaufruf und hat:readResolve()
writeReplace()
getStub()
getBusinessInterfaceName()
quelle