背景java
團隊內部輪流技術分享,其餘人都是分享源碼,我每次都是設計和架構,感受本身太特立獨行。此次我要合羣點,分享點源碼。面試
概念架構
Service Provider Interface:服務提供方接口。是一種JVM層面的服務註冊發現機制。框架
誰在用ide
jdbc源碼裏我見過SPI、Dubbo源碼裏我見過SPI、Eleasticsearch源碼裏我見過SPI……在基礎服務中使用佔比很高。編碼
怎麼判斷有沒有用設計
如上圖,META-INF/services下面能看到長的很像類的徹底限定名,就八九不離十了。3d
怎麼用blog
服務註冊發現機制一個簡陋的實現就是找到一個知足需求的服務就返回。若是調用第一個服務出了異常崩潰了,就接着查找下一個。SPI最簡單使用也是如此。token
1>定義一個服務端
step1:實現服務接口
step2:在META-INF/services下建立接口的徹底限定名爲文件名的文件,編碼爲utf8。
step3:在文件內協商接口的實現類的徹底限定名,能夠是一個,也能夠是一個列表
2>定義一個客戶端
step1:經過java.util.ServiceLoader.load方法來加載服務的實現(框架裏也能夠用@SPI註解)
step2:基於拿到的數據本身作註冊發現
這也是在DriverManager中的一個方法,實現了找到一個能用的就返回。
原理
服務端很好理解,就是一個定義。客戶端來看看ServiceLoader的源碼。