2010-08-01 7 views
6

Die SessionContext.getBusinessObject() ist in der Dokumentation beschrieben, wie folgt,Wie unterscheidet sich der Rückgabewert von SessionContext.getBusinessObject() von dem in der Bean verwendeten 'this' Schlüsselwort?

ein Objekt erhalten, die verwendet werden können, die aktuelle bean durch die gegebene Geschäftsschnittstelle aufzurufen.

Parameter: businessInterface - Eine der lokalen Business-Schnittstellen oder Remote-Business-Schnittstellen für diese Session-Bean.

Rückgabe: Das Geschäftsobjekt, das der angegebenen Geschäftsschnittstelle entspricht.

Kann ich nicht stattdessen das Schlüsselwort 'this' in Java verwenden, um dasselbe zu erreichen? Wie unterscheiden sich diese?

Antwort

14

Die Motivation hier ist, dass die meisten EJB-Implementierungen auf Proxies arbeiten. Sie würden nicht zu weit davon entfernt sein, es als Old School AOP zu betrachten. Die Business-Schnittstelle wird durch den EJB-Container implementiert, oft über einen einfachen java.lang.reflect.Proxy, und dieses Objekt wird an jeden im System übergeben, der über @ EJB oder JNDI nach dem ejb fragt.

Der Proxy wird an den Container angeschlossen und alle Anrufe gehen direkt an den Container, der Sicherheitsüberprüfungen durchführt, Transaktionen startet/stoppt/aussetzt, Interzeptoren aufruft, etc. usw. und schließlich den Anruf an den Container delegiert Bean-Instanz - und natürlich alle Aufräumarbeiten, die aufgrund irgendwelcher Ausnahmen erforderlich sind - übergeben Sie den Rückgabewert schließlich über den Proxy an den Aufrufer.

Wenn Sie this.foo() direkt aufrufen oder diese an einen Aufrufer übergeben, damit sie auch direkt anrufen können, wird alles übersprungen und der Container wird effektiv aus dem Bild geschnitten. Die 'getBusinessObject (Class)' Methode erlaubt es der Bean-Instanz, sich selbst einen Proxy zu geben, damit sie ihre eigenen Methoden aufrufen und die damit verbundenen Container-Management-Dienste nutzen kann - Interceptors, Transaktionsmanagement, Security Enforcement, etc.

+0

Eine sehr klare Erklärung, David! Vielen Dank ! – stratwine

+0

Kann jemand auch bestätigen, dass wir mit SessionContext.getBusinessObject() garantieren, dass @Asynchronous-Methoden in verschiedenen Threads ausgeführt werden? –

Verwandte Themen