Java SPI 實例
阿新 • • 發佈:2019-01-25
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.Demo1Service2 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 實例