Best Practices - Newsletter Nr. 5 - Komponenten und Services

Dieser Newsletter beleuchtet das Annotationsgespann @Component und @Service näher. Es gibt viele Optionen, die nicht immer in sinnvoller Zusammensetzung angewendet werden.

 

@Componen

Die Annotation @Component sorgt erst einmal dafür, dass es sich um eine Komponente im Sinne von OSGI handelt. Die wichtigsten Parameter dabei sind.

  • metatype

Legt fest, ob für die Komponente durch das Maven-SCR-Plugin Metadaten generiert werden. Ist der Wert auf true gesetzt, ist dies der Fall. Die Folge daraus ist, dass der Service in der Felix-Console unter system/console/configMgr angezeigt wird und somit konfigurierbar ist. Hat der Service keine Properties, die zu konfigurieren sind, sollte der Wert für metatype auf false gesetzt werden, bzw. gar nicht gesetzt sein, da der Defaultwert false entspricht. In der Felix-Console  unter system/console/components ist er dennoch verfügbar und kann im Fehlerfall deaktiviert werden.

  • componentAbstract

Markiert eine Komponente als abstract. Es wird kein Servicedescriptor für die abstrakte Klasse generiert. Erbt eine andere Komponente von dieser, werden beim Starten der Komponente auch die Servicereferenzen der abstrakten Klasse belegt, sowie Properties im erbenden Service zur Konfiguration angeboten. Diese Property ist aktuell deprecated. Wenn nicht unbedingt notwendig, sollte es nicht mehr verwendet werden.

  • label

Ist der Titel, der in der Felix-Console unter system/console/configMgr angezeigt wird. Unter system/console/components wird die PID angezeigt. Das Label sollte immer gesetzt sein. Das Label sollte im Projekt einer Namenskonvention folgen, damit alle konfigurierbaren Services in der Felix-Console klar dem Projekt zuordenbar sind.

  • name

Der Name der Komponente. Dieser wird als PID (systemweit eindeutige String) verwendet. Ist der Name nicht gesetzt, wird der voll qualifizierte Name der Klasse verwendet. Dies sollte auch so genutzt werden - also den Namen nicht setzen.

  • immediate

Soll die OSGI-Komponente sofort beim Hochfahren des OSGI-Bundles verfügbar sein oder erst wenn diese das erste Mal aktiv wird. Der Standardwert ist false. Die Erfahrung zeigt aber, dass es sinnvoll ist, Komponenten immer sofort zu starten.

 

@Service

Die Annotation @Service sorgt dafür,  dass der Service als Implementierung eines bestimmten Interfaces im OSGI-Kontext registriert wird. Alle Komponenten, die das Interface nutzen, z.B. mit bind… bzw. unbind… Methode, erhalten somit Kenntnis vom Vorhandensein des Services. Werden keine Interfaces angegeben, werden alle Interfaces, die ein Service implementiert über die @Service Annotation dem OSGI-Kontext bekannt gemacht.

Diese Annotation wird nicht zur Laufzeit ausgewertet, sondern beim Bauen eines Bundles. Für die Auswertung sorgt das Apache Felix Maven SCR Plugin, welches aus den Annotationen XML-Dateien erzeugt. Das Apache Maven Bundle Plugin nimmt diese Informationen wiederum, um daraus die MANIFEST.MF zu erzeugen, die beim Installieren des Bundles ausgewertet wird.

 

Ihr Ansprechpartner