Java Reference
In-Depth Information
in Listing 13.7. Die @Local-Annotation drückt aus, dass die Schnittstelle CounterProvider
nur intern benutzt wird. Mit „intern“ ist gemeint, dass über diese Schnittstelle die Metho-
den des Beans nur aus Klassen derselben Komponente (d. h. Klassen, die sich in derselben
EJB-Jar-Datei oder in derselben Ear-Datei befi nden) heraus aufgerufen werden. Der gewal-
tige Unterschied ist jetzt aber, dass sich die Parameterübergabe und die Übergabe von Rück-
gabewerten dadurch von Call-By-Value auf Call-By-Reference bzw. von Return-By-Value auf
Return-By-Reference ändert. Zur Erinnerung: Es gibt ja nur ein einziges CounterProvider-
Objekt (da Singleton Bean) und folglich auch nur ein einziges Counter-Objekt. Wenn jetzt
die Methode getCounter eine Referenz zurückliefert, dann haben damit alle Stateless-Bean-
Objekte Zugriff auf dieses eine Counter-Objekt. Die Zählung erfolgt jetzt in korrekter Weise.
Wie gesehen kann es mehrere Objekte der Stateless-Bean-Klasse HelloImpl geben (das war
ja die Ursache in früheren Implementierungen für das inkorrekte Zählen). Wenn diese
Bean-Objekte alle eine Referenz auf dasselbe Counter-Objekt besitzen und die Methode say-
Hello für diese unterschiedlichen Bean-Objekte parallel aufgerufen wird, dann erfolgt der
Zugriff auf das Counter-Objekt in paralleler Weise. Aus diesem Grund wurde die Methode
increment in Listing 13.6 vorsorglich bereits mit synchronized versehen.
Übrigens führt die Referenzübergabe zusammen mit der gemeinsamen Nutzung der Klasse
Counter in den Teilkomponenten Hello und CounterProvider zu keinem Problem, da die
beiden Teilkomponenten in einem Enterprise Application Project in Form einer Ear-Datei
zusammengepackt werden und somit alle Klassen durch denselben ClassLoader geladen
werden.
Durch die Änderung der Annotation von @Remote in @Local ist es nun natürlich nicht mehr
möglich, das CounterProvider-Bean von außen zu nutzen, was in diesem speziellen Fall
auch nicht schlimm ist, da eine solche Nutzung sowieso ziemlich sinnlos war. In anderen
Fällen kann es aber auch durchaus vorkommen, dass ein Bean sowohl intern über Call-By-
Reference als auch extern über Call-By-Value genutzt werden soll. Dies ist jedoch überhaupt
kein Problem: Man kann zu diesem Zweck einfach zwei Schnittstellten defi nieren, die sich
außer durch ihren Namen nur in der Annotation @Local und @Remote unterscheiden. In der
Bean-Klasse muss man dann einfach angeben, dass die Klasse beide Schnittstellen imple-
mentiert. Damit erreicht man mühelos das gewünschte Ziel.
In einer Ear-Datei können sich nicht nur EJB-Jar-Dateien befi nden, sondern auch War-
Dateien mit Servlets. Es ist dann problemlos möglich, auch in einem Servlet über die Anno-
tation @EJB mit Dependency Injection eine Referenz auf ein Bean zu setzen und dieses Bean
im Servlet zu verwenden.
1310 Entities und Transaktionssteuerung
Neben den Session Beans sind die Entities ein zweiter, äußerst wichtiger Bereich von EJB.
Da diese aber für das Komponententhema keine Rolle spielen, wollen wir dieses Thema nur
in aller Kürze durch ein sehr einfaches Beispiel streifen.
Durch Entities wird ein Zugriff auf eine Datenbank in einfacher Weise ermöglicht: Entity-
Klassen stehen im einfachsten Fall für Datenbanktabellen und Entity-Objekte für Zeilen in
 
Search WWH ::




Custom Search