2012-04-12 14 views
1

我碰到一個問題,我寫了一個Class(EasybImpl),它實現了EasybPlugin,但是當我迭代提供者時,我無法獲得我編寫的EasybImpl支持。如何使用ServiceRegistry

我以爲EasybImpl使用System類加載器和控制檯println作爲sun.misc.Launcher $ AppClassLoader的類加載器。它出什麼問題了。

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

回答

2

您是否將您的班級聲明爲服務提供者?

要聲明服務提供者,服務子目錄放置在每個JAR文件中的META-INF目錄中。該目錄包含每個服務提供者接口的文件,該接口在JAR文件中具有一個或多個實現類。例如,如果JAR文件包含一個名爲com.mycompany.mypkg.MyServiceImpl的類,該類實現javax.someapi.SomeService接口,則JAR文件將包含一個名爲的文件:

META-INF/services/javax.someapi .SomeService包含行

com.mycompany.mypkg.MyService

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

0

四個步驟是熱曲ired:

  • 你在你的JAR文件中建立一個META-INF/services子目錄。
  • 在'services'目錄中,爲您正在實施的每個服務創建一個文件。 (在你的情況下,這將是文件META-INFA/services/my.package.EasybPlugin)。
  • 在該文件中,聲明您的實現類的名稱。
  • 然後,您可以使用java.util.ServiceLoader API發現&加載註冊的服務。

服務提供商文件的一個示例:

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

然後,您可以查找和加載服務實現這樣的:

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

注1:ServiceProvider API,你看是真正針對Image IO,例如閱讀圖像文件格式。 ServiceLoader是一般用途&應該是首選的,除非你的目的不是閱讀圖像。

有一個更詳細的教程在這裏:http://literatejava.com/extensibility/java-serviceloader-extensible-applications/

參考文獻: