Java SPI機制簡介


SPI 簡介

SPI 全稱為 (Service Provider Interface) ,是JDK內置的一種服務提供發現機制。 目前有不少框架用它來做服務的擴展發現, 簡單來說,它就是一種動態替換發現的機制, 舉個例子來說, 有個接口,想運行時動態的給它添加實現,你只需要添加一個實現,

而后,把新加的實現,描述給JDK知道就行啦(通過改一個文本文件即可) 公司內部,目前Dubbo框架就基於SPI機制提供擴展功能。

簡單示例

通過一個簡單例子來說明SPI是如何使用的。 首先通過一張圖來看看,用SPI需要遵循哪些規范,因為spi畢竟是JDK的一種標准。 "" 我們首先需要一個目錄,META-INF\services 如下,最終的目錄路徑就像這樣:

1
2 3 4 5 6 7 8 9 10 11 12 
└── src ├── com │   └── ivanzhang │   └── spi │   ├── HelloInterface.java │   ├── impl │   │   ├── ImageHello.java │   │   └── TextHello.java │   └── SPIMain.java └── META-INF  └── services  └── com.ivanzhang.spi.HelloInterface

文件名字為 接口/抽象類: 全名 文件內容: 接口/抽象類 實現類

就像這樣: com.ivanzhang.spi.impl.TextHello com.ivanzhang.spi.impl.ImageHello

接下來, 我們需要定義接口和實現類:

1
2 3 
public interface HelloInterface {  public void sayHello(); }

實現類:

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 
public class TextHello implements HelloInterface {   @Override  public void sayHello() {  System.out.println("Text Hello.");  }  }  public class ImageHello implements HelloInterface {  @Override  public void sayHello() {  System.out.println("Image Hello");  } }

最后,來看看,如果使用SPI機制,客戶端代碼:

1
2 3 4 5 6 7 8 9 10 11 
public class SPIMain {  public static void main(String[] args) {   ServiceLoader<HelloInterface> loaders =  ServiceLoader.load(HelloInterface.class);   for (HelloInterface in : loaders) {  in.sayHello();  }  } }

最后的輸出: Text Hello.Image Hello

 


免責聲明!

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



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