【Java面試】大廠裁員,小廠倒閉,如何搞定面試官Java SPI是什麼?有什麼用?

来源:https://www.cnblogs.com/mic112/archive/2022/09/23/16722536.html
-Advertisement-
Play Games

“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。

然後在應用開發的時候,根據集成的驅動實現連接到對應資料庫。

image-20220813151427856

Java中SPI機制主要思想是將裝配的控制權移到程式之外實現標準和實現的解耦,以及提供動態可插拔的能力,在模塊化的設立中,這種思想非常重要。

實現Java SPI,需要滿足幾個基本的格式:

  • 需要先定義一個介面,作為擴展的標準

  • 在classpath目錄下創建META-INF/service文件目錄

  • 在這個目錄下,以介面的全限定名命名的配置文件, 文件內容是這個介面的實現類

  • 在應用程式裡面,使用ServiceLoad,就可以根據介面名稱找到classpath所有的擴展時間

    然後根據上下文場景選擇實現類完成功能的調用。

image-20220813153622832

Java SPI有一定的不足之處,比如,不能根據需求去載入擴展實現,每次都會載入擴展介面的所有實現類併進行實例化,實例化會造成性能開銷,並且載入一些不需要用到的實現類,會導致記憶體資源的浪費。

高手:

Java SPI是Java裡面提供的一種介面擴展機制。

它的作用我認為有兩個:

  • 把標准定義和介面實現分離,在模塊化開發中很好的實現瞭解耦
  • 實現功能的擴展,更好的滿足定製化的需求

除了Java的SPI以外,基於SPI思想的擴展實現還有很多,比如Spring裡面的SpringFactoriesLoader。

Dubbo裡面的ExtensionLoader,並且Dubbo還在SPI基礎上做了更進一步優化,提供了激活擴展點、自適應擴展點。

總結

大家知道怎麼回答了嗎?

如果你喜歡我的作品,記得點贊收藏加關註哦!!!

版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在子類派生的新方法中如何重用父類的功能 方式一:指名道姓調用某一個類下的函數=》不依賴於繼承關係 class OldboyPeople: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def f1( ...
  • 多用戶即時通訊系統04 4.編碼實現03 4.5功能實現-群聊功能實現 4.5.1思路分析 群聊的實現思路和私聊的實現非常類似。 不同的是:私聊時,服務端接收到消息後,只需要找出接收方的socket併發送消息即可 群聊時,服務端在接收到消息後需要遍歷集合中所有的線程,找出除了發送方的所有客戶端的so ...
  • 一、聚合查詢 需要導入模塊:from django.db.models import Max, Min, Sum, Count, Avg 關鍵語法:aggregate(聚合結果別名 = 聚合函數(參數)) 查詢結果:使用聚合函數,從每一個組中獲取結果:字典 註意點: 1 聚合函數必須在分組之後才能使 ...
  • java基礎 以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 https://www.cnblogs.com/lyh1024/p/16720908.html Ø 冒泡排序原理: 比較數組中,兩個相鄰的元素,如果第一個數比第二個數大,我們就交換他們的位置; 每一次比較,都會產生出一個最大,或者最 ...
  • SSD實現思路 SSD具有如下主要特點: 從YOLO中繼承了將detection轉化為regression的思路,一次完成目標定位與分類 基於Faster RCNN中的Anchor,提出了相似的Prior box; 加入基於特征金字塔(Pyramidal Feature Hierarchy)的檢測方 ...
  • 本文按照mac講解protobuf的安裝,windows上比較好安裝按照mac的基本流程就可以安裝成功,mac上的安裝有的時候比較容易出現問題 一、通過brew的方式安裝(僅Mac) 需要mac中存在brew,輸入命令:brew --version 查看是否存在brew,如不存在就進行安裝,安裝方法 ...
  • 大家好,,這篇文章咱們聊下JVM性能優化的問題 這篇文章主要介紹下JVM的運行數據區相關的內容,包括: 程式計數器 虛擬機棧 本地方法棧 堆 方法區 案例 和總結 好了,開始乾貨環節~ 作為一個常識性的知識,大家都知道位元組碼只是一個二進位文件存放在那裡。要想在jvm里跑起來,先得有個運行的記憶體環境。 ...
  • 在數據分析過程中,一般提取資料庫裡面的數據時候,拿著表格數據反覆思索,希望能夠根據自己所想立馬生成一張數據可視化的圖表來更直觀的呈現數據。 但想要進行數據可視化的時候,往往需要調用很多的庫與函數,還需要數據轉換以及大量的代碼處理編寫。這都是十分繁瑣的工作,確實只為了數據可視化我們不需要實現數據可視化 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...