Java Reference
In-Depth Information
{
return "Hallo " + name + " (Aufruf Nr. " +
counter.increment() + ")";
}
@PostConstruct
public void init()
{
counter = cp.getCounter();
}
}
Das Problem war, dass bei meinen Versuchen mit Glassfi sh die Depenedency Injection nicht
funktionierte, wenn man die beiden EJB-Komponenten CounterProvider und Hello in sepa-
raten EJB-Jar-Dateien installiert. Wenn man aber die beiden zusammen in eine Ear-Datei
packt (vgl. Abschnitt 13.5) und diese Ear-Datei installiert, klappt alles wie erwartet. Die
Ear-Datei ist wiederum eine Jar-Datei, die die beiden Jar-Dateien enthält sowie ein Verzeich-
nis META-INF mit einer Manifest-Datei, in der nichts Wesentliches steht. Die Jar-Datei der
Hello-Komponente sollte in diesem Fall die Class-Dateien der CounterProvider-Komponente
nicht mehr enthalten, denn die Klassen aller in einer Ear-Datei enthaltenen EJB-Jar-Dateien
werden durch einen gemeinsamen ClassLoader geladen.
Für diesen Komfort der Dependency Injection zahlen wir aber einen gewissen Preis. Die
EJB-Komponenten werden jetzt zusammen in eine Anwendung gepackt und werden somit
zusammen installiert und deinstalliert. Ich würde jetzt das, was sich in der Ear-Datei befi n-
det, als Komponente bezeichnen, denn das ist die Installationseinheit. Die darin enthalte-
nen Jar-Dateien stellen folglich Teilkomponenten dar.
Übrigens zeigt dieses Beispiel auch ganz schön, warum man die Initialisierung einer Bean
nicht im Konstruktor, sondern in einer mit @PostConstruct annotierten Methode durchfüh-
ren sollte. Wenn der Konstruktor aufgerufen wird, hat das Attribut cp noch den Wert null.
Der Aufruf von getCounter im Konstruktor würde folglich zu einer NullPointerException
führen. In unserem Beispiel wird aber zuerst das Objekt erzeugt (mit einem leeren Konst-
ruktor), dann wird die Dependency Injection durch den EJB-Container vorgenommen und
erst dann wird die Initialisierungsmethode aufgerufen. Zu diesem Zeitpunkt ist cp dann
eben nicht mehr null und der Aufruf von getCounter gelingt.
Nun ist es allerdings nach wie vor so, dass die Aufrufe der Methode sayHello nicht richtig
ge zählt werden. Dieses Problem soll nun im letzten Schritt behoben werden.
1 3 .9 .3 Lokale Schnittstellen
Wir führen jetzt an unserer Anwendung eine letzte, sehr harmlos wirkende Änderung
durch, die aber eine relativ große Wirkung hat. Wir ändern die Annotation der Schnittstelle
CounterProvider von
@Remote
auf
@Local
 
Search WWH ::




Custom Search