人生有涯,學海無涯spi是相對api而言的。
api指的是應用對服務呼叫方提供的介面,用於提供某種服務、功能,面向的是服務呼叫方。
spi指的是應用對服務實現方提供的介面,用於實現某種服務、功能,面向的是服務實現方
package com.jw.spi;
public
inte***ce
fruit
package com.jw.spi;
public
class
implements
fruit
}
package com.jw.spi;
public
class
banana
implements
fruit
}
在resource下建立/meta-inf/services目錄,在services目錄下建立以服務介面全限定名為名稱的檔案:com.jw.spi.fruit
檔案內容為,當前服務實現的服務實現者類的全限定名
public
class
test
}}
執行結果為:
spi的實現主要依靠的就是serviceloader類。使用該類載入介面型別(例如:fruit.class)
serviceloader
s = serviceloader.
load
(fruit.
class
);
雖然是乙個load方法,但是並沒有載入到指定的服務實現類,這裡僅僅是對載入服務實現類做一些準備工作:
下面分析一下serviceloader類的原始碼:
public
final
class
serviceloader
implements
iterable
public
static
serviceloader
load
(class
service,
classloader loader)
private
serviceloader
(class
svc, classloader cl)
public
void
reload()
// 私有內部類,提供對所有的service的類的載入與例項化
private
class
lazyiterator
implements
iterator
....
}
然後建立迭代器:iteratorit = s.iterator();
public iterator
iterator()
public s next()
public
void
remove()
};}
iterator方法中採用了匿名內部類的方式定義了乙個新的迭代器,這個迭代器中每乙個方法都是通過呼叫之前建立好的延遲迭代器lookupiterator來完成的
最後就是進行迭代載入了。
while
(it.
hasnext()
)
public
boolean
hasnext()
else};
return accesscontroller.
doprivileged
(action, acc);}
}private
boolean
hasnextservice()
if(configs == null)
catch
(ioexception x)
}while
((pending == null)
||!pending.
hasnext()
) pending =
parse
(service, configs.
nextelement()
);} nextname = pending.
next()
;return
true
;}
hasnext方法呼叫了延遲迭代器的hasnext方法,內部呼叫了hasnextservice方法,在這個方法中就會設法去找到指定名稱(meta-inf/services/+介面全限定名)的資源檔案。並完成讀取檔案內容的操作。
然後執行it.next()操作,這個又會呼叫延遲迭代器的對應方法hasnext,內部呼叫了nextservice方法,這個方法主要功能就是載入上面從檔案中讀取到的全限定名稱表示的類。並生成例項,將例項儲存到providers中。
public s next()
else};
return accesscontroller.
doprivileged
(action, acc);}
}private s nextservice()
catch
(classnotfoundexception x)if(
!service.
isassignablefrom
(c))
trycatch
(throwable x)
throw
newerror()
;}
關於spi的詳解到此就結束了,總結下spi能帶來的好處: SPI匯流排的初步認識
spi是摩托羅拉公司定義的一種序列外圍裝置介面。spi匯流排主要應用於eeprom flash 實時時鐘 ad轉換器 還有數字訊號處理器和數碼訊號解碼器之間。spi是一種高速的 全雙工的同步通訊匯流排,並且在晶元的管腳上只占用四根線,節約了晶元的管腳,同時為pcb的布局上節省空間,提供方便。spi一...
你認識它嗎 什麼是QR碼?
手機 這有介紹 qr code手機 最佳伴侶 手機近拍鏡頭 微拍鏡頭 微距功能 什麼是qr碼?qr碼到底什麼樣?呈正方形,標準的只有黑白兩色。在4個角落的其中3個,印有較小,像 回 字的的正方圖案,這3個是幫助解碼軟體定位的圖案,深色和淺色的模組都表示不同的資訊。利用什麼工具識讀qr裡面的資訊?和正...
追了多年的開發框架,你還認識指標嗎?
高階語言玩多了,可能很多人對指標或者彙編都淡忘了,本篇就和大家聊一聊指標,雖然c 中是不提倡使用的,但你能說指標在c 中不重要嗎?你要知道fcl內庫中大量的使用指標,如string,encoding,filestream等等數不勝數,如例 private unsafe static bool equ...