色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java中的SPI動態擴展(下)

jf_78858299 ? 來源:碼農參上 ? 作者:Dr Hydra ? 2023-03-24 14:27 ? 次閱讀

4、服務發現

現在兩個服務提供方都實現了接口,下面關鍵的一步就是服務發現,這一步java中的spi發現機制已經幫我們實現好了。

創建一個新項目aircondition-app,引入上面打好的兩個jar包。

<dependencies>
    <dependency>
        <groupId>com.cn.hydra<span class="hljs-name"groupId>
        <artifactId>aircondition-hanging-type<span class="hljs-name"artifactId>
        <version>1.0-SNAPSHOT<span class="hljs-name"version>
    <span class="hljs-name"dependency>

    <dependency>
        <groupId>com.cn.hydra<span class="hljs-name"groupId>
        <artifactId>aircondition-vertical-type<span class="hljs-name"artifactId>
        <version>1.0-SNAPSHOT<span class="hljs-name"version>
    <span class="hljs-name"dependency>
<span class="hljs-name"dependencies>

按照上面的說法,雖然每個服務提供者對于接口都有不同的實現,但是作為調用者來說,它并不需要關心具體的實現類,我們要做的是通過接口來調用服務提供者實現的方法。

下面,就是關鍵的服務發現環節,我們寫一個方法,根據型號去調用對應空調的開關方法。

public class AirconditionApp {
    public static void main(String[] args) {
        new AirconditionApp().turnOn("VerticalType");
    }

    public void turnOn(String type){
        ServiceLoader

測試結果:

圖片

可以看到,測試過程中,通過定義的接口IAircondition發現了兩個實現類,并通過參數,調用了特定實現類的某個方法。整段代碼中沒有出現過具體的服務實現類,操作都是通過接口調用。

5、原理

了解了spi的工作流程,我們再來看看它的實現,其實最關鍵的就是上面代碼中出現的ServiceLoader這個類。

上面的示例代碼中,對于ServiceLoaderload()方法的結果,我們用for循環進行了遍歷,這一點我們看一下源碼就能明白,因為ServiceLoader實現了Iterable這一接口,而整個服務發現的核心,就在它的iterator()方法中。

圖片

注意這里面有兩個關鍵的東西,找一下在源碼中定義的地方:

圖片

注釋寫的非常明白,providers就是一個緩存,在迭代器中如果先從這里面進行查找,如果里面有就繼續往下找,沒有了的話就用這個懶加載的lookupIterator查找。

那么就簡單了,接著往下看LazyIterator,看看它里面的hasNext()next()兩個方法是怎么實現的。

圖片

這個acc是一個安全管理器,在前面通過System.getSecurityManager()判斷并賦值,debug看一下這里都是null,所以直接看hasNextService()nextService()方法就可以了。

hasNextService()方法中,會取出接口取出實現類的類名放到nextName中:

圖片

接下來,在nextService()方法中,則會先加載這個實現類,然后實例化對象,最終放入緩存中去。

圖片

在迭代器的迭代過程中,會完成所有實現類的實例化,其實歸根結底,還是基于java反射去實現的。

6、應用

要說spi的實際應用,大家最常見的應該就是日志框架slf4j了,它利用spi實現了插槽式接入其他具體的日志框架。

說白了,slf4j本身就是個日志門面,并不提供具體的實現,需要綁定其他具體實現才能真正的引入日志功能。

例如我們可使用log4j2作為具體的綁定器,只需要在pom中引入slf4j-log4j12,就可以使用具體功能。

org.slf4j
    slf4j-api
    2.0.3


    org.slf4j
    slf4j-log4j12
    2.0.3

引入項目后,點開它的jar包看一下具體結構:

圖片

有沒有發現一個彩蛋,先說為什么我們pom中引入的明明是slf4j-log4j12,實際上引入的是slf4j-reload4j?翻一下官網的文檔:

圖片

大意就是在2015年和2022年,log4j1.x就已經宣布end of life終止了,原因也不難猜,估計是因為頻繁爆出的漏洞。在那之后,slf4j-log4j在構建階段就會自動重定向到slf4j-reload4j了,并且官方也強烈建議使用slf4j-reload4j作為替代。

再回頭看一下jar包的META-INF.services里面,通過spi注入了Reload4jServiceProvider這個實現類,它實現了SLF4JServiceProvider這一接口,在它的初始化方法initialize()中,會完成初始化等工作,后續可以繼續獲取到LoggerFactoryLogger等具體日志對象。

7、總結

Java中的SPI提供了一種比較特別的服務發現和調用機制,通過接口靈活的將服務調用與服務提供者分離,用于提供給第三方實現擴展時還是很方便的。但是也有缺點,比方說一旦加載一個接口,就會把所有實現類都加載進來,可能會加載到不需要的冗余服務。不過站在整體角度上,還是給我們提供了一種非常不錯的框架擴展、集成的思路。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2970

    瀏覽量

    104808
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1707

    瀏覽量

    91666
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68680
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14353
收藏 人收藏

    評論

    相關推薦

    AG32 SPI擴展使用

    platformio.ini 的 logic 選項: C. 生成 logic 出來(點 prepare LOGIC): D. 復制上邊準備好的 full_duplex_spi.v,覆蓋掉 logic 剛生成
    發表于 05-28 11:19

    聊聊Dubbo - Dubbo可擴展機制實戰

    是對Dubbo的擴展機制有一個基本的了解。如果對Java SPI比較了解的同學,可以跳過。Java SPI(Service Provider
    發表于 06-04 17:33

    嵌入式Linux系統內核抽象的動態擴展技術

    運行時由JVM(Java VirtualMachine)動態地加載。Liao等人在1996年提出,將JVM插入到微內核,從而可以讓用戶編寫Java程序,以
    發表于 10-26 09:22

    嵌入式Linux系統內核抽象的動態擴展技術

    運行時由JVM(Java VirtualMachine)動態地加載。Liao等人在1996年提出,將JVM插入到微內核,從而可以讓用戶編寫Java程序,以
    發表于 10-28 09:53

    嵌入式Linux系統內核抽象的動態擴展技術

    嵌入式Linux系統內核抽象的動態擴展技術隨著嵌入式技術的快速發展和嵌入式設備的普及,嵌入式應用發展的一個關鍵趨勢是從靜態的、固定的系統功能到動態的、可
    發表于 04-04 17:12

    java動態代理機制和作用

    的我們的功能,我們更需要學習的是其底層是怎么樣的一個原理,而AOP的原理就是java動態代理機制,所以本篇隨筆就是對java動態機制進行一個回顧。 在
    發表于 09-27 14:37 ?0次下載

    java動態代理分析

    定義:為其他對象提供一種代理以控制對這個對象的訪問。 動態代理使用 java動態代理機制以巧妙的方式實現了代理模式的設計理念。 代理模式示例代碼 publicinterfaceSubject
    發表于 09-27 15:14 ?0次下載

    英創信息技術JAVA操作英創主板SPI接口簡介

    2017年9月,英創在Linux的文件系統移植了針對嵌入式Linux的JRE(Java Runtime Environment),能夠支持Java應用程序的運行。由于Java語言不能
    的頭像 發表于 02-06 11:09 ?1933次閱讀
    英創信息技術<b class='flag-5'>JAVA</b>操作英創主板<b class='flag-5'>SPI</b>接口簡介

    Java實驗:類和對象的擴展

    Java實驗:類和對象的擴展
    發表于 07-08 15:36 ?20次下載
    <b class='flag-5'>Java</b>實驗:類和對象的<b class='flag-5'>擴展</b>

    源碼級深度理解Java SPI

    SPI 配置:Java SPI 機制約定的配置文件,提供查找服務實現類的邏輯。配置文件必須置于 META-INF/services 目錄,并且,文件名應與服務提供者接口的完全限定名保
    的頭像 發表于 11-15 11:38 ?669次閱讀

    基于spring的SPI擴展機制是如何實現的?

    基本上,你一說是基于 spring 的 SPI 擴展機制,再把spring.factories文件和EnableAutoConfiguration提一,那么這個問題就答的八九不離十了。
    的頭像 發表于 03-07 09:17 ?1056次閱讀

    JavaSPI動態擴展(上)

    基本上,你一說是基于spring的SPI擴展機制,再把`spring.factories`文件和`EnableAutoConfiguration`提一,那么這個問題就答的八九不離十了。
    的頭像 發表于 03-24 14:27 ?470次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>的<b class='flag-5'>SPI</b><b class='flag-5'>動態</b><b class='flag-5'>擴展</b>(上)

    Java、Spring、Dubbo三者SPI機制的原理和區別

    其實我之前寫過一篇類似的文章,但是這篇文章主要是剖析dubbo的SPI機制的源碼,中間只是簡單地介紹了一Java、Spring的SPI機制,并沒有進行深入,所以本篇就來深入聊一聊這三
    的頭像 發表于 06-05 15:21 ?1060次閱讀
    <b class='flag-5'>Java</b>、Spring、Dubbo三者<b class='flag-5'>SPI</b>機制的原理和區別

    SPI是什么?Java SPI的使用介紹

    SPI 全稱 Service Provider Interface,是 Java 提供的一套用來被第三方實現或者擴展的 API,它可以用來啟用框架擴展和替換組件。
    的頭像 發表于 09-02 09:58 ?1401次閱讀
    <b class='flag-5'>SPI</b>是什么?<b class='flag-5'>Java</b> <b class='flag-5'>SPI</b>的使用介紹

    java本身自帶的SPI擴展機制是怎么一回事?

    八股文背多了,相信大家都聽說過一個詞,SPI 擴展 。
    的頭像 發表于 01-02 10:32 ?695次閱讀
    <b class='flag-5'>java</b>本身自帶的<b class='flag-5'>SPI</b><b class='flag-5'>擴展</b>機制是怎么一回事?
    主站蜘蛛池模板: 久久草香蕉频线观| chinese学生gv video| 亚洲中文久久久久久国产精品 | 谁有成人网站地址| ca88亚洲城娱乐| 日日噜噜夜夜爽爽| yellow视频免费观看高清在线| 久久人妻少妇嫩草AV蜜桃35I| 亚洲精品视频在线观看免费| 国产露脸无码A区久久蘑菇| 青娱国产区在线| chinese东北夫妻video| 忘忧草下载| 国产精品久久久久久亚洲影视| 三级视频黄色| 久久99re6热在线播放| 中国毛片网| 久久伊人在| 95国产欧洲精华液| 欧美日韩高清一区| 超碰在线视频地址| 色呦呦人人视频| 国产精品高清在线观看93| 野花韩国中文版免费观看| 久久久擼擼擼麻豆| 中文字幕成人在线观看| 日韩欧美中文字幕在线| 国产成人免费a在线视频app| 香蕉eeww99国产精选播放| 国偷自产AV一区二区三区健身房| 亚洲欧美日韩高清中文在线| 久久视频在线视频观看天天看视频| www黄色com| 性直播免费| 国产人妻人伦精品无码.麻豆 | 美女叉腿掰阴大胆艺术照| yellow日本动漫高清| 亚洲精品久久久久AV无码林星阑| 久久久久久久久女黄| 国产不卡免费| 97人人添人人澡人人澡人人澡 |