1. SPI是什么?
SPI即Service Provider Interface,用我不太專業(yè)的英語閱讀理解就是服務供應者接口,反正大致就是這個意思。
那么這個接口有什么用處呢?或者說在JAVA中,這個東西有什么用?我總結能力比較差,于是我在網(wǎng)上找了一段文字。我覺得這個描述挺好的,至少比我好。
出處:Java SPI (Service Provider Interface) 機制詳解

2. SPI的例子
- 創(chuàng)建一個接口
ISayHello
package cn.lazyfennec;
public interface ISayHello {
void sayHello();
}
- 創(chuàng)建兩個實現(xiàn)類
SayHelloWithChinese和SayHelloWithEnglish
- SayHelloWithChinese
package cn.lazyfennec.sayhello;
import cn.lazyfennec.ISayHello;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/11/25 15:17
*/
public class SayHelloWithChinese implements ISayHello {
@Override
public void sayHello() {
System.out.println("你好!");
}
}
- SayHelloWithEnglish
package cn.lazyfennec.sayhello;
import cn.lazyfennec.ISayHello;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/11/25 15:16
*/
public class SayHelloWithEnglish implements ISayHello {
@Override
public void sayHello() {
System.out.println("Hello!");
}
}
-
創(chuàng)建如下結構的內(nèi)容,其中
services目錄下的文件名稱需要與ISayHello接口的全類名一致。
編輯
cn.lazyfennec.ISayHello文件的內(nèi)容,里邊每一行對應一個實現(xiàn)類
cn.lazyfennec.sayhello.SayHelloWithChinese
cn.lazyfennec.sayhello.SayHelloWithEnglish
- 創(chuàng)建測試類
SpiTest,這里會展示如何通過SPI機制獲取相關的實現(xiàn)類。
package cn.lazyfennec;
import java.util.ServiceLoader;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/11/25 15:19
*/
public class SpiTest {
public static void main(String[] args) {
ServiceLoader<ISayHello> load = ServiceLoader.load(ISayHello.class);
// 這里打印了ServiceLoader的內(nèi)容
System.out.println(load);
System.out.println("==============這是個分割線=================");
for (ISayHello sayHello : load) {
// 打印具體的類名
System.out.println(sayHello.getClass().getSimpleName());
// 執(zhí)行方法
sayHello.sayHello();
System.out.println("===============================");
}
}
}
- 運行結果
java.util.ServiceLoader[cn.lazyfennec.ISayHello]
==============這是個分割線=================
SayHelloWithChinese
你好!
===============================
SayHelloWithEnglish
Hello!
===============================
Process finished with exit code 0
如果覺得有收獲,歡迎點贊和評論,更多知識,請點擊關注查看我的主頁信息哦~
