欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java SPI 機制知識點總結

 更新時間:2020年02月24日 10:39:45   作者:crossoverJie  
在本篇文章里小編給大家整理的是一篇關于Java SPI 機制知識點總結內容,需要的朋友們可以參考下。

前言

不知大家現(xiàn)在有沒有去公司復工,我已經在家辦公將近 3 周了,同時也在家呆了一個多月;還好工作并沒有受到任何影響,我個人一直覺得遠程工作和 IT 行業(yè)是非常契合的,這段時間的工作效率甚至比在辦公室還高,同時由于我們公司的業(yè)務在海外,所以疫情幾乎沒有造成太多影響。

扯遠了,這次主要是想和大家分享一下 Java 的 SPI 機制。

還沒看過的朋友的我先做個前景提要,當時的需求:

我實現(xiàn)了一個類似于的 SpringMVC 但卻很輕量的 http 框架 cicada,其中當然也需要一個 IOC 容器,可以存放所有的單例 bean。

這個 IOC 容器的實現(xiàn)我希望可以有多種方式,甚至可以提供一個接口供其他人實現(xiàn);當然切換這個 IOC 容器的過程肯定是不能存在硬編碼的,也就是這里所提到的可拔插。當我想使用 A 的實現(xiàn)方式時,我就引入 A 的 jar 包,使用 B 時就引入 B 的包。

先給大家看看兩次實現(xiàn)的區(qū)別,先從代碼簡潔程度來說就是 SPI 更勝一籌。

什么是 SPI

在具體分析之前還是先了解下 SPI 是什么?

首先它其實是 Service provider interface 的簡寫,翻譯成中文就是服務提供發(fā)現(xiàn)接口。

不過這里不要被這個名詞搞混了,這里的服務發(fā)現(xiàn)和我們常聽到的微服務中的服務發(fā)現(xiàn)并不能劃等號。

就如同上文提到的對 IOC 容器的多種實現(xiàn)方式 A、B、C(可以把它們理解為服務),我需要在運行時知道應該使用哪一種具體的實現(xiàn)。

其實本質上來說這就是一種典型的面向接口編程,這一點在我們剛開始學習編程的時候就被反復強調了。

SPI 實踐

接下來我們來如何來利用 SPI 實現(xiàn)剛才提到的可拔插 IOC 容器。

既然剛才都提到了 SPI 的本質就是面向接口編程,所以自然我們首先需要定義一個接口:

其中包含了一些 Bean 容器所必須的操作:注冊、獲取、釋放 bean。

為了讓其他人也能實現(xiàn)自己的 IOC 容器,所以我們將這個接口單獨放到一個 Module 中,可供他人引入實現(xiàn)。

所以當我要實現(xiàn)一個單例的 IOC 容器時,我只需要新建一個 Module 然后引入剛才的模塊并實現(xiàn) CicadaBeanFactory 接口即可。

當然其中最重要的則是需要在 resources 目錄下新建一個 META-INF/services/top.crossoverjie.cicada.base.bean.CicadaBeanFactory 文件,文件名必須得是我們之前定義接口的全限定名(SPI 規(guī)范)。

其中的內容便是我們自己實現(xiàn)類的全限定名:

top.crossoverjie.cicada.bean.ioc.CicadaIoc

可以想象最終會通過這里的全限定名來反射創(chuàng)建對象。

只不過這個過程 Java 已經提供 API 屏蔽掉了:

public static CicadaBeanFactory getCicadaBeanFactory() {
    ServiceLoader<CicadaBeanFactory> cicadaBeanFactories = ServiceLoader.load(CicadaBeanFactory.class);
    if (cicadaBeanFactories.iterator().hasNext()){
      return cicadaBeanFactories.iterator().next() ;
    }

    return new CicadaDefaultBean();
  }

當 classpath 中存在我們剛才的實現(xiàn)類(引入實現(xiàn)類的 jar 包),便可以通過 java.util.ServiceLoader 工具類來找到所有的實現(xiàn)類(可以有多個實現(xiàn)類同時存在,只不過通常我們只需要一個)。

一些都準備好之后,使用自然就非常簡單了。

<dependency>
    <groupId>top.crossoverjie.opensource</groupId>
    <artifactId>cicada-ioc</artifactId>
    <version>2.0.4</version>
  </dependency>

我們只需要引入這個依賴便能使用它的實現(xiàn),當我們想換一種實現(xiàn)方式時只需要更換一個依賴即可。

這樣就做到了不修改一行代碼靈活的可拔插選擇 IOC 容器了。

SPI 的一些其他應用

雖然平時并不會直接使用到 SPI 來實現(xiàn)業(yè)務,但其實我們使用過的絕大多數框架都會提供 SPI 接口方便使用者擴展自己的功能。

比如 Dubbo 中提供一系列的擴展:

同類型的 RPC 框架 motan 中也提供了響應的擴展:

他們的使用方式都和 Java SPI 非常類似,只不過原理略有不同,同時也新增了一些功能。

比如 motan 的 spi 允許是否為單例等等。

再比如 MySQL 的驅動包也是利用 SPI 來實現(xiàn)自己的連接邏輯。

總結

Java 自身的 SPI 其實也有點小毛病,比如:

遍歷加載所有實現(xiàn)類效率較低。當多個 ServiceLoader 同時 load 時會有并發(fā)問題(雖然沒人這么干)。

最后總結一下,SPI 并不是某項高深的技術,本質就是面向接口編程,而面向接口本身在我們日常開發(fā)中也是必備技能,所以了解使用 SPI 也是很用處的。

本文所有源碼:

https://github.com/TogetherOS/cicada

到此這篇關于Java SPI 機制知識點總結的文章就介紹到這了,更多相關Java SPI 機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中equals與==的用法和區(qū)別

    Java中equals與==的用法和區(qū)別

    這篇文章主要給大家介紹了關于Java中equals與==的用法和區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Java結構性設計模式中的裝飾器模式介紹使用

    Java結構性設計模式中的裝飾器模式介紹使用

    裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關系的一種替代方案,本篇文章以虹貓藍兔生動形象的為你帶來詳細講解
    2022-09-09
  • 全網最全SpringBoot集成swagger的詳細教程

    全網最全SpringBoot集成swagger的詳細教程

    swagger是當下比較流行的實時接口文文檔生成工具,swagger分為swagger2?和swagger3兩個常用版本,二者區(qū)別不是很大,主要對于依賴和注解進行了優(yōu)化,swagger2需要引入2個jar包,swagger3只需要一個,用起來沒有什么大的區(qū)別,本文給大家詳細介紹,感興趣的朋友一起看看吧
    2022-08-08
  • MyBatis自定義TypeHandler如何解決字段映射問題

    MyBatis自定義TypeHandler如何解決字段映射問題

    這篇文章主要介紹了MyBatis自定義TypeHandler如何解決字段映射問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Sequelize 常用操作詳解及實例代碼

    Sequelize 常用操作詳解及實例代碼

    這篇文章主要介紹了Sequelize 常用操作詳解及實例代碼的相關資料,希望能幫助到大家,需要的朋友可以參考下
    2016-11-11
  • 深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較

    深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較

    這篇文章主要介紹了ArrayList 和 LinkedList的執(zhí)行效率比較的相關資料,需要的朋友可以參考下
    2017-08-08
  • idea中使用Inputstream流導致中文亂碼解決方法

    idea中使用Inputstream流導致中文亂碼解決方法

    很多朋友遇到一個措手不及的問題當idea中使用Inputstream流導致中文亂碼及Java FileInputStream讀中文亂碼問題,針對這兩個問題很多朋友不知道該如何解決,下面小編把解決方案分享給大家供大家參考
    2021-05-05
  • java分布式面試系統(tǒng)限流最佳實踐

    java分布式面試系統(tǒng)限流最佳實踐

    這篇文章主要介紹了java分布式面試系統(tǒng)限流最佳實踐場景分析解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • SpringBoot 進行限流的操作方法

    SpringBoot 進行限流的操作方法

    限流是對某一時間窗口內的請求數進行限制,保持系統(tǒng)的可用性和穩(wěn)定性,防止因流量暴增而導致的系統(tǒng)運行緩慢或宕機。本文重點給大家介紹SpringBoot 進行限流的操作方法,感興趣的朋友一起看看吧
    2021-10-10
  • SpringCloud?OpenFeign概述與使用教程

    SpringCloud?OpenFeign概述與使用教程

    OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網絡通信的細節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網絡通信細節(jié)。所有遠程調用,都像調用本地方法一樣完成
    2023-02-02

最新評論