JAVA SPI(Service Provider Interface)原理、設計及源碼解析(其一)


背景

團隊內部輪流技術分享,其他人都是分享源碼,我每次都是設計和架構,感覺自己太特立獨行。這次我要合群點,分享點源碼。

概念

Service Provider Interface:服務提供方接口。是一種JVM層面的服務注冊發現機制。

誰在用

jdbc源碼里我見過SPI、Dubbo源碼里我見過SPI、Eleasticsearch源碼里我見過SPI……在基礎服務中使用占比很高。

怎么判斷有沒有用

如上圖,META-INF/services下面能看到長的很像類的完全限定名,就八九不離十了。

怎么用

 

服務注冊發現機制一個簡陋的實現就是找到一個滿足需求的服務就返回。如果調用第一個服務出了異常崩潰了,就接着查找下一個。SPI最簡單使用也是如此。

1>定義一個服務端

step1:實現服務接口

step2:在META-INF/services下創建接口的完全限定名為文件名的文件,編碼為utf8。

 

 step3:在文件內協商接口的實現類的完全限定名,可以是一個,也可以是一個列表

2>定義一個客戶端

step1:通過java.util.ServiceLoader.load方法來加載服務的實現(框架里也可以用@SPI注解)

step2:基於拿到的數據自己做注冊發現

這也是在DriverManager中的一個方法,實現了找到一個能用的就返回。

原理

服務端很好理解,就是一個定義。客戶端來看看ServiceLoader的源碼。

 

 

 


免責聲明!

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



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