Ich bin daran interessiert, OSGI als Mittel zur Verwaltung von Plugins für ein Projekt zu verwenden. Das heißt, es kann viele Implementierer meiner Schnittstelle geben, die jeweils in einem eigenen / separaten OSGI-Bundle mit der Implementierungsklasse exportiert werden...
Antworten
Zu viele Anzeigen?Deklarativer Dienst sollte der richtige Weg sein.
Sie können Ihre Schnittstelle als Dienstleistung
<service>
<provide interface="my.Interface"/>
<property name="foo" value="bar"
</service>
Jede Implementierung dieser Schnittstelle kann Bundle-Aktivierungs- und Deaktivierungsmethoden definieren.
Aber was wirklich toll ist, ist ihre Natur: Wenn Sie die neueste SCR (die "Service Component Runtime", die ein "Extender Bundle" ist, das die neue und verbesserte OSGi R4.2 DS - Declarative Service - Spezifikation implementiert) verwenden, importieren Ihre Klassen nichts aus dem OSGI-Modell. Sie bleiben reine POJOs.
Dann definieren Sie einen weiteren Dienst, der von Ihrem ersten Dienst abhängt:
<reference name="myInterfaceServiceName"
interface="my.Interface"
bind="myActivationMethod" unbind="myDeactivationMethod"
cardinality="0..n"/>
Dieser Dienst wird alle konkreten Instanzen Ihres ersten Dienstes aufspüren und auflisten und sie so behandeln, wie Sie es beabsichtigen.
Siehe die Eclipse-Erweiterungen und deklarative Dienste Frage für weitere Einzelheiten.
Die Präsentation: Komponentenorientierte Entwicklung in OSGi mit deklarativen Diensten, dynamischen Spring-Modulen und Apache iPOJO von der EclipseCON2009 wird Ihnen ein konkretes Beispiel liefern.
Dies kann deklarativ (wie VonC) oder dynamisch zur Laufzeit über die Standarddienstregistrierung erfolgen.
Jeder Implementierer kann seine Implementierungen einfach als Dienst registrieren, und die Verbraucher können sie von der Registry abrufen, was ziemlich grundlegendes OSGi-Material ist. Die Dienste können auch mit Eigenschaften registriert werden, so dass die Verbraucher diese Eigenschaften verwenden können, um zwischen den Implementierungen zu unterscheiden, wenn sie den Dienst nachschlagen.