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).

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.

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.
Hinterlasse einen Kommentar