Java的SPI機制

1. SPI是什么?

SPI即Service Provider Interface,用我不太專業(yè)的英語閱讀理解就是服務供應者接口,反正大致就是這個意思。

那么這個接口有什么用處呢?或者說在JAVA中,這個東西有什么用?我總結能力比較差,于是我在網(wǎng)上找了一段文字。我覺得這個描述挺好的,至少比我好。

出處:Java SPI (Service Provider Interface) 機制詳解


2. SPI的例子

  1. 創(chuàng)建一個接口 ISayHello
package cn.lazyfennec;

public interface ISayHello {

    void sayHello();
}
  1. 創(chuàng)建兩個實現(xiàn)類 SayHelloWithChineseSayHelloWithEnglish
  • 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!");
    }
}
  1. 創(chuàng)建如下結構的內(nèi)容,其中services目錄下的文件名稱需要與ISayHello接口的全類名一致。

  2. 編輯cn.lazyfennec.ISayHello文件的內(nèi)容,里邊每一行對應一個實現(xiàn)類

cn.lazyfennec.sayhello.SayHelloWithChinese
cn.lazyfennec.sayhello.SayHelloWithEnglish
  1. 創(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("===============================");
        }
    }
}
  1. 運行結果
java.util.ServiceLoader[cn.lazyfennec.ISayHello]
==============這是個分割線=================
SayHelloWithChinese
你好!
===============================
SayHelloWithEnglish
Hello!
===============================

Process finished with exit code 0

如果覺得有收獲,歡迎點贊和評論,更多知識,請點擊關注查看我的主頁信息哦~

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容