1. 程式人生 > 其它 >jdk的SPI機制

jdk的SPI機制

技術標籤:Java

一、概述

最早看到 SPI 這個機制是在dubbo 實現中,最近發現原來也不是什麼新東西,竟然就是 JDK 中內建的玩意,今天就來一探究竟,看看它到底是什麼玩意!

SPI的全稱是 Service Provider Interface,它是一種服務發現機制,它通過在 classPath 路徑下的 META-INF/services 資料夾查詢服務實現,自動載入檔案裡所定義的介面實現類。

回到頂部

二、實現

首先,我們定義了一個介面 HelloService.java 和它的兩個實現類 HelloServiceImplA.java、HelloServiceImplB.java

public interface HelloService {

    void hello();
}
public class HelloServiceImplA implements HelloService {
    
    @Override
    public void hello() {
        System.out.println("Hello! I am ImplA");
    }
}
public class HelloServiceImplB implements HelloService {
    
    @Override
    public void hello() {
        System.out.println("Hello! I am ImplB");
    }
}

接著,我們需要在 META-INF/services 下新建檔案,檔名為介面全類名,檔案內容即介面實現類全類名(多個實現類換行表示)。

最後,就是我們服務發現過程了,需要藉助 ServiceLoader 類。

public class HelloServiceTest {

    public static void main(String[] args) {
        ServiceLoader<HelloService> serviceLoader = ServiceLoader.load(HelloService.class);
        Iterator<HelloService> iterator = serviceLoader.iterator();
        while (iterator.hasNext()) {
            HelloService helloService = iterator.next();
            helloService.hello();
        }
    }
}

回到頂部

三、總結

各位看官覺得如何?這種不用在程式中宣告介面實現,又能夠發起呼叫的方式,是不是讓人覺得耳目一新!

SPI 的底層實現基本使用了反射機制,通過全類名例項化介面實現,從而發起呼叫。

SPI 機制為很多框架擴充套件提供了可能,比如在Dubbo、JDBC中都使用到了SPI機制。