1. 程式人生 > >Java SPI 實例

Java SPI 實例

ace 兩個 未使用 alt 功能 pack load loader 接口

SPI 全稱為 Service Provider Interface,是一種服務發現機制。SPI 的本質是將接口實現類的全限定名配置在文件中,並由服務加載器讀取配置文件,加載實現類。這樣可以在運行時,動態為接口替換實現類。

這裏簡單寫一個例子示意

創建DemoService接口 如下

 1 package com.demo;
 2 
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public interface DemoService {
 8 
 9     void sayHello();
10 
11 }

創建兩個實現類如下

Demo1Service
 1 package com.demo;
 2 
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public class Demo1Service implements DemoService {
 8 
 9     @Override
10     public void sayHello() {
11         System.out.println("hello  I am Demo1Service");
12     }
13 }

Demo2Service

 1 package com.demo;
 2 
 3 /**
 4
* @author chaixg 5 * 2019/1/25 6 */ 7 public class Demo2Service implements DemoService { 8 9 @Override 10 public void sayHello() { 11 System.out.println("hello I am Demo2Service"); 12 } 13 }

java SPI 讀取 META-INF/services/{接口名} 此目錄 創建com.demo.DemoService文件,寫上實現類 如下

1 com.demo.Demo1Service
2 com.demo.Demo2Service

創建測試類Main方法調用

 1 package com.demo;
 2 
 3 import java.util.ServiceLoader;
 4 
 5 /**
 6  * @author chaixg
 7  * 2019/1/25
 8  */
 9 public class Demo {
10 
11     public static void main(String[] args) {
12 
13         ServiceLoader.load(DemoService.class).forEach(DemoService::sayHello);
14     }
15 }

執行結果如下

技術分享圖片

在文件中寫上哪些實現類 這裏就會獲取到哪些實現類的實例

我們就可以利用JDK提供的這一功能特性來做到動態給接口替換實現類 dubbo框架就利用了這一特性作為框架基礎 不過Dubbo 並未使用 Java SPI,而是重新實現了一套功能更強的 SPI 機制。有興趣者可以查看dubbo的實現

over...

Java SPI 實例