SPI 是 Service Provider Interface 的縮寫,中文解釋為服務提供發現介面
SPI 是一種「基於介面的程式設計 + 策略模式 + 配置檔案」組合實現的動態載入介面實現類的機制
實現步驟:
- 在類路徑下的
META-INF/services
目錄下,建立以服務介面的 "全限定名" 命名的檔案,檔案的內容為介面實現類的全限定名,每行一個介面實現 - 實現類必須在當前程式的 classpath 下
- 使用
java.util.ServiceLoader
動態載入介面實現(ServiceLoader
會自動掃描 META-INF/services 下的配置檔案載入實現類)
示例如下:
1、建立介面
package com.test.root.base.spi;
public class FirstSpiService implements SimpleSpiService {
@Override
public void say() {
System.out.println("Say first!");
}
}
2、實現介面
package com.test.root.base.spi;
public class FirstSpiService implements SimpleSpiService {
@Override
public void say() {
System.out.println("Say first!");
}
}
package com.test.root.base.spi;
public class SecondSpiService implements SimpleSpiService {
@Override
public void say() {
System.out.println("Say Second!");
}
}
3、建立 SPI 檔案
SPI檔案內容
com.test.root.base.spi.FirstSpiService
com.test.root.base.spi.SecondSpiService
2、載入並使用介面實現
package com.test.root.base.spi;
import java.util.ServiceLoader;
public class SpiTest {
public static void main(String[] args) {
ServiceLoader<SimpleSpiService> simpleSpiServices = ServiceLoader.load(SimpleSpiService.class);
for (SimpleSpiService simpleSpiService : simpleSpiServices) {
simpleSpiService.say();
}
}
}