Eclipse 4 Dependency Injection mit dem Spring Framework

Definition von OSGi Services via Spring DI

In dem com.vogella.e4.rcp.blueprintservice.api Bundle ist die Schnittstelle des OSGi Services definiert (IService, Abb. 4).

Abb. 4: In dem „com.vogella.e4.rcp.blueprintservice.api“ Bundle ist die Schnittstelle des OSGi Services definiert

In dem com.vogella.e4.rcp.blueprintservice.service Bundle ist unter META-INF/spring eine osgi-context.xml angelegt, in der eine Instanz einer Serviceimplementierung erstellt und als OSGi Service exportiert wird. Die Implementierung des Services ist hier nebensächlich und trivial. Für den Export wird hier der Spring-Dialekt verwendet (Abb. 5).

Abb. 5: Für den Export wird der Spring-Dialekt verwendet. (Vergrößern)

Damit ist der OSGi Service schon fertig exportiert. Sobald dieses Bundle in den Zustand STARTED wechselt, wird der Context wie beschrieben von dem Extender Bundle erzeugt und gestartet, und der Service steht allen anderen OSGi Bundles zur Verfügung. Und selbstverständlich wird der Service auch wieder entfernt, wenn das Bundle gestoppt wird. Eine häufige Fehlerquelle ist, dass die Bundles, die den Service definieren, auch gestartet sein müssen. Dazu muss in dem entsprechenden Service-Plug-in das Flag „Activate this plug-in when one of its classes is loaded“ gesetzt sein (Abb. 6). Alternativ könnte man das Plug-in auch automatisch im Produkt starten.

Abb. 6: Das Flag „Activate this plug-in when one of its classes is loaded“ muss gesetzt sein

Ist das Service Bundle gestartet, werden diverse weitere Log-Ausgaben produziert, u. a. dass der Service gestartet wurde und unter welchem Interface er exportiert wurde. Damit das klappen kann, müssen API und Service Bundle mit in das Produkt aufgenommen werden. Im Beispiel sind sie beide im Produktfeature enthalten.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.