1.What is SPI?
?????? SPI是上游產(chǎn)商給服務(wù)供應(yīng)商提供的接口啊胶,供應(yīng)商遵循接口契約提供自己的實(shí)現(xiàn).啤贩。提供了服務(wù)接口的一種實(shí)現(xiàn)之后子库,在jar包的META-INF/services/目錄里同時(shí)創(chuàng)建一個(gè)以服務(wù)接口命名的文件睁冬。該文件里就是實(shí)現(xiàn)該服務(wù)接口的具體實(shí)現(xiàn)類(lèi)蝌诡。而當(dāng)外部程序裝配這個(gè)模塊的時(shí)候溉贿,就能通過(guò)該jar包META-INF/services/里的配置文件找到具體的實(shí)現(xiàn)類(lèi)名枫吧,并裝載實(shí)例化浦旱,完成模塊的注入。 基于這樣一個(gè)約定就能很好的找到服務(wù)接口的實(shí)現(xiàn)類(lèi)九杂,而不需要再代碼里制定颁湖。簡(jiǎn)單來(lái)講就是為某個(gè)接口尋找服務(wù)實(shí)現(xiàn)的機(jī)制。
2.SPI & dubbo
對(duì)于多數(shù)看過(guò)dubbo源碼的小伙伴例隆,對(duì)于SPI應(yīng)該再熟悉不過(guò)了甥捺,幾乎多數(shù)的部分都是通過(guò)spi實(shí)現(xiàn)的。
此圖來(lái)源于dubbo官網(wǎng)镀层,圖片最右面的標(biāo)注說(shuō)明:只有Service 和 Config 層為 API镰禾,其它各層均為 SPI〕辏可見(jiàn)SPI在dubbo中是多么重要的組成不分吴侦。
3.SPI java 示例
1.定義接口
public interface ICall {
?????? public String call();
}
2.增加實(shí)現(xiàn)類(lèi)
public class DogCall implements ICall{
???? public String call() {
????????????? return "汪汪汪";
????? }
}
3.在增加文件 com.zxx.spi.ICall
在路徑src/main/resources 路徑下增加META-INF/services 路徑,并添加
“com.zxx.spi.ICall” 為文件名的文件坞古。
內(nèi)容為:com.zxx.spi.impl.DogCall 注:加粗部分為包名备韧,依項(xiàng)目不同而變。
4.增加測(cè)試類(lèi)
public class TestCall {
public ServiceLoader<ICall> serviceloader = ServiceLoader.load(ICall.class);
public static void main(String[] args) {
??? TestCall testCall = new TestCall();
??? ICall icall = testCall.getCall();
??? System.out.println(icall.call());
}
public ICall getCall() {
??? ICall last = null;
??? for (ICall call : serviceloader) {
????? last = call;
? ? }
? ?? return last;
}
執(zhí)行文件輸出“汪汪汪”痪枫。
好了到此织堂,基礎(chǔ)的java spi項(xiàng)目已經(jīng)實(shí)現(xiàn),之后會(huì)對(duì)dubbo SPI 與java spi做比較奶陈。
謝謝收看易阳,下期見(jiàn)!3粤!潦俺!