“Java SPI是什麼?有什麼用?” 這是阿裡p6面試過程中,第二面的時候遇到的一個真實的問題。 如果你不理解SPI,建議你看完整個視頻。 大家好,我是Mic,一個工作了14年的Java程式員 這道面試題的文字版我已經整理在20萬字的文檔里了,有需要的可以在文章尾端領取 下麵來看看這個問題考察的目 ...
“Java SPI是什麼?有什麼用?”
這是阿裡p6面試過程中,第二面的時候遇到的一個真實的問題。
如果你不理解SPI,建議你看完整個視頻。
大家好,我是Mic,一個工作了14年的Java程式員
這道面試題的文字版我已經整理在20萬字的文檔里了,有需要的可以在文章尾端領取
下麵來看看這個問題考察的目的
考察目標
這道題考察難度偏中等,對於沒怎麼去研究過源碼的同學來說,SPI是非常陌生的概念
考察人群主要還是3到5年比較多。
3~5年屬於中高端Java開發人群,因此考察目的也很明顯:
- 瞭解求職者對於技術領域的理解程度
- 實現高級開發的人才選拔
Java這個行業沒有人才評級標準,所以在面試的時候,面試官也比較難去界定你的職級。
所以在互聯網企業,技術面的考察會比較深。
所以,要想回答好這個問題,還是要有一些自己的見解。
問題解析
Java SPI,全稱是Service Provider Interface。
它是一種基於介面的動態擴展機制,相當於Java裡面提供了一套介面。
然後第三方可以實現這個介面來完成功能的擴展和實現。
舉個簡單的例子。
在Java的SDK裡面,提供了一個資料庫驅動的介面java.sql.Driver。
它的作用是提供資料庫的訪問能力。
不過,在Java裡面並沒有提供實現,因為不同的資料庫廠商,會有不同的語法和實現。
所以只能由第三方資料庫廠商來實現,比如Oracle是oracle.jdbc.OracleDriver,mysql是com.mysql.jdbc.Driver。
然後在應用開發的時候,根據集成的驅動實現連接到對應資料庫。
Java中SPI機制主要思想是將裝配的控制權移到程式之外實現標準和實現的解耦,以及提供動態可插拔的能力,在模塊化的設立中,這種思想非常重要。
實現Java SPI,需要滿足幾個基本的格式:
-
需要先定義一個介面,作為擴展的標準
-
在classpath目錄下創建META-INF/service文件目錄
-
在這個目錄下,以介面的全限定名命名的配置文件, 文件內容是這個介面的實現類
-
在應用程式裡面,使用ServiceLoad,就可以根據介面名稱找到classpath所有的擴展時間
然後根據上下文場景選擇實現類完成功能的調用。
Java SPI有一定的不足之處,比如,不能根據需求去載入擴展實現,每次都會載入擴展介面的所有實現類併進行實例化,實例化會造成性能開銷,並且載入一些不需要用到的實現類,會導致記憶體資源的浪費。
高手:
Java SPI是Java裡面提供的一種介面擴展機制。
它的作用我認為有兩個:
- 把標准定義和介面實現分離,在模塊化開發中很好的實現瞭解耦
- 實現功能的擴展,更好的滿足定製化的需求
除了Java的SPI以外,基於SPI思想的擴展實現還有很多,比如Spring裡面的SpringFactoriesLoader。
Dubbo裡面的ExtensionLoader,並且Dubbo還在SPI基礎上做了更進一步優化,提供了激活擴展點、自適應擴展點。
總結
大家知道怎麼回答了嗎?
如果你喜歡我的作品,記得點贊收藏加關註哦!!!
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!