一、簡介
java中spi(service provider interface)是jdk內建的一種服務發現機制,可以基於配置,在執行時載入指定服務。java中提供了很多服務提供介面,如jdbc、jndi等。
二、開發步驟
spi開發中,涉及介面、實現類、配置檔案和服務載入,具體開發步驟如下:
定義介面和實現類(可多個);
在專案resources目錄下建立META-INF/services資料夾,接著在services資料夾下建立以介面完整類路徑名(包含包路徑和介面名)為檔名的檔案,檔案內容為需要載入的服務(實現類)的完整類路徑名,一行一個; 目錄結構類似:
resources--
|-services--
|-com.dragon.study.spring_boot_main.spi.Hello
檔案內容類似:
com.dragon.study.spring_boot_main.spi.HelloOne
com.dragon.study.spring_boot_main.spi.HelloTwo
在啟動類中載入服務,程式碼類似:
//載入方式一
Iterator<Hello> it = Service.providers(Hello.class);
while(it.hasNext()){
it.next().hello();
}
//載入方式二
ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class);
for (Hello h : hellos){
h.hello();
}
三、使用示例
3.1 定義介面和實現類
介面:
package com.dragon.study.spring_boot_main.spi;
public interface Hello {
void hello();
}
實現類一:
package com.dragon.study.spring_boot_main.spi;
public class HelloOne implements Hello {
@Override
public void hello() {
System.out.println("hello one");
}
}
實現類二:
package com.dragon.study.spring_boot_main.spi;
public class HelloTwo implements Hello {
@Override
public void hello() {
System.out.println("hello two");
}
}
3.2 定義配置檔案
在resources/META-INF/services目錄下建立配置檔案com.dragon.study.spring_boot_main.spi.Hello,內容如下:
com.dragon.study.spring_boot_main.spi.HelloOne
com.dragon.study.spring_boot_main.spi.HelloTwo
3.3 啟動類中載入服務
package com.dragon.study.spring_boot_main.spi;
import sun.misc.Service;
import java.util.Iterator;
import java.util.ServiceLoader;
public class SpiMain {
public static void main(String[] args) {
//載入方式一
// Iterator<Hello> it = Service.providers(Hello.class);
// while(it.hasNext()){
// it.next().hello();
// }
//載入方式二
ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class);
for (Hello h : hellos){
h.hello();
}
}
}
啟動後輸出:
hello one
hello two