JDK SPI 機制


一、概述

最早看到 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機制。


參考博文:
  1. 揭秘JDK SPI

  2. 深入理解SPI機制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM