2012-04-12 18 views
1

Ich laufe auf ein Problem, schrieb ich eine Class(EasybImpl), die EasybPlugin implementieren, aber wenn ich Provider iteriere, konnte ich nicht die EasyBImpl Unterstützung, die ich schrieb.So verwenden Sie ServiceRegistry

Ich dachte, die EasybImpl verwendet den System Classloader und die Konsole println im Classloader als sun.misc.Launcher $ AppClassLoader. Was stimmt damit nicht.

Iterator providers = ServiceRegistry.lookupProviders(EasybPlugin.class, 
         ClassLoader.getSystemClassLoader()); 

Antwort

2

Haben Sie Ihre Klasse als Dienstanbieter deklariert?

Um einen Dienstanbieter zu deklarieren, wird ein Unterverzeichnis für Dienste in das Verzeichnis META-INF gestellt, das in jeder JAR-Datei vorhanden ist. Dieses Verzeichnis enthält eine Datei für jede Service Provider-Schnittstelle, in der sich eine oder mehrere Implementierungsklassen in der JAR-Datei befinden. Wenn die JAR-Datei beispielsweise eine Klasse namens com.mycompany.mypkg.MyServiceImpl enthält, die die Schnittstelle javax.someapi.SomeService implementiert, enthält die JAR-Datei eine Datei mit dem Namen:

META-INF/services/javax.someapi .SomeService

enthält die Zeile:

com.mycompany.mypkg.MyService

http://docs.oracle.com/javase/6/docs/api/javax/imageio/spi/ServiceRegistry.html

0

Vier Schritte requ sind ied:

  • Sie erstellen ein META-INF/Dienste-Unterverzeichnis in Ihre JAR-Datei.
  • Erstellen Sie im Verzeichnis 'services' für jeden von Ihnen implementierten Dienst eine Datei. (In Ihrem Fall wäre dies Datei META-INFA/services/my.package.EasybPlugin).
  • deklarieren Sie in dieser Datei den Namen Ihrer Implementierungsklasse (n).
  • können Sie dann die java.util.ServiceLoader API verwenden, um & laden registrierte Dienste zu entdecken.

Ein Beispiel für die Service-Provider-Datei:

# providers of EasyBPlugin SPI 
# (comment lines begin with pound) 
my.package.StandardEasybPlugin 

Anschließend können Sie finden und Last Service-Implementierungen wie folgt aus:

ServiceLoader<EasybPlugin> loader = ServiceLoader.load(EasybPlugin.class); 
for (EasybPlugin plugin : loader) { 
    // ... 
} 

Anmerkung 1: Die ServiceProvider API Sie waren auf der Suche ist wirklich auf Image IO ausgerichtet, zB Lesen von Bilddateiformaten. ServiceLoader ist für den allgemeinen Gebrauch & sollte bevorzugt werden, es sei denn, Ihr Zweck ist nicht Bilder lesen.

Es gibt ein detaillierteres Tutorial hier: http://literatejava.com/extensibility/java-serviceloader-extensible-applications/

Referenzen: