女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java中的SPI動(dòng)態(tài)擴(kuò)展(下)

jf_78858299 ? 來(lái)源:碼農(nóng)參上 ? 作者:Dr Hydra ? 2023-03-24 14:27 ? 次閱讀

4、服務(wù)發(fā)現(xiàn)

現(xiàn)在兩個(gè)服務(wù)提供方都實(shí)現(xiàn)了接口,下面關(guān)鍵的一步就是服務(wù)發(fā)現(xiàn),這一步java中的spi發(fā)現(xiàn)機(jī)制已經(jīng)幫我們實(shí)現(xiàn)好了。

創(chuàng)建一個(gè)新項(xiàng)目aircondition-app,引入上面打好的兩個(gè)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>

按照上面的說(shuō)法,雖然每個(gè)服務(wù)提供者對(duì)于接口都有不同的實(shí)現(xiàn),但是作為調(diào)用者來(lái)說(shuō),它并不需要關(guān)心具體的實(shí)現(xiàn)類(lèi),我們要做的是通過(guò)接口來(lái)調(diào)用服務(wù)提供者實(shí)現(xiàn)的方法。

下面,就是關(guān)鍵的服務(wù)發(fā)現(xiàn)環(huán)節(jié),我們寫(xiě)一個(gè)方法,根據(jù)型號(hào)去調(diào)用對(duì)應(yīng)空調(diào)的開(kāi)關(guān)方法。

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

    public void turnOn(String type){
        ServiceLoader

測(cè)試結(jié)果:

圖片

可以看到,測(cè)試過(guò)程中,通過(guò)定義的接口IAircondition發(fā)現(xiàn)了兩個(gè)實(shí)現(xiàn)類(lèi),并通過(guò)參數(shù),調(diào)用了特定實(shí)現(xiàn)類(lèi)的某個(gè)方法。整段代碼中沒(méi)有出現(xiàn)過(guò)具體的服務(wù)實(shí)現(xiàn)類(lèi),操作都是通過(guò)接口調(diào)用。

5、原理

了解了spi的工作流程,我們?cè)賮?lái)看看它的實(shí)現(xiàn),其實(shí)最關(guān)鍵的就是上面代碼中出現(xiàn)的ServiceLoader這個(gè)類(lèi)。

上面的示例代碼中,對(duì)于ServiceLoaderload()方法的結(jié)果,我們用for循環(huán)進(jìn)行了遍歷,這一點(diǎn)我們看一下源碼就能明白,因?yàn)?code>ServiceLoader實(shí)現(xiàn)了Iterable這一接口,而整個(gè)服務(wù)發(fā)現(xiàn)的核心,就在它的iterator()方法中。

圖片

注意這里面有兩個(gè)關(guān)鍵的東西,找一下在源碼中定義的地方:

圖片

注釋寫(xiě)的非常明白,providers就是一個(gè)緩存,在迭代器中如果先從這里面進(jìn)行查找,如果里面有就繼續(xù)往下找,沒(méi)有了的話(huà)就用這個(gè)懶加載的lookupIterator查找。

那么就簡(jiǎn)單了,接著往下看LazyIterator,看看它里面的hasNext()next()兩個(gè)方法是怎么實(shí)現(xiàn)的。

圖片

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

hasNextService()方法中,會(huì)取出接口取出實(shí)現(xiàn)類(lèi)的類(lèi)名放到nextName中:

圖片

接下來(lái),在nextService()方法中,則會(huì)先加載這個(gè)實(shí)現(xiàn)類(lèi),然后實(shí)例化對(duì)象,最終放入緩存中去。

圖片

在迭代器的迭代過(guò)程中,會(huì)完成所有實(shí)現(xiàn)類(lèi)的實(shí)例化,其實(shí)歸根結(jié)底,還是基于java反射去實(shí)現(xiàn)的。

6、應(yīng)用

要說(shuō)spi的實(shí)際應(yīng)用,大家最常見(jiàn)的應(yīng)該就是日志框架slf4j了,它利用spi實(shí)現(xiàn)了插槽式接入其他具體的日志框架。

說(shuō)白了,slf4j本身就是個(gè)日志門(mén)面,并不提供具體的實(shí)現(xiàn),需要綁定其他具體實(shí)現(xiàn)才能真正的引入日志功能。

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

org.slf4j
    slf4j-api
    2.0.3


    org.slf4j
    slf4j-log4j12
    2.0.3

引入項(xiàng)目后,點(diǎn)開(kāi)它的jar包看一下具體結(jié)構(gòu):

圖片

有沒(méi)有發(fā)現(xiàn)一個(gè)彩蛋,先說(shuō)為什么我們pom中引入的明明是slf4j-log4j12,實(shí)際上引入的是slf4j-reload4j?翻一下官網(wǎng)的文檔:

圖片

大意就是在2015年和2022年,log4j1.x就已經(jīng)宣布end of life終止了,原因也不難猜,估計(jì)是因?yàn)轭l繁爆出的漏洞。在那之后,slf4j-log4j在構(gòu)建階段就會(huì)自動(dòng)重定向到slf4j-reload4j了,并且官方也強(qiáng)烈建議使用slf4j-reload4j作為替代。

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

7、總結(jié)

Java中的SPI提供了一種比較特別的服務(wù)發(fā)現(xiàn)和調(diào)用機(jī)制,通過(guò)接口靈活的將服務(wù)調(diào)用與服務(wù)提供者分離,用于提供給第三方實(shí)現(xiàn)擴(kuò)展時(shí)還是很方便的。但是也有缺點(diǎn),比方說(shuō)一旦加載一個(gè)接口,就會(huì)把所有實(shí)現(xiàn)類(lèi)都加載進(jìn)來(lái),可能會(huì)加載到不需要的冗余服務(wù)。不過(guò)站在整體角度上,還是給我們提供了一種非常不錯(cuò)的框架擴(kuò)展、集成的思路。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2984

    瀏覽量

    106831
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1775

    瀏覽量

    94649
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70239
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14878
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    JavaSPI機(jī)制詳解

    接口規(guī)范以及可以發(fā)現(xiàn)接口實(shí)現(xiàn)的機(jī)制,而不需要實(shí)現(xiàn)接口。 SPI機(jī)制在Java應(yīng)用廣泛。例如:JDBC的數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)使用SPI機(jī)制,只定
    的頭像 發(fā)表于 03-05 11:35 ?657次閱讀
    <b class='flag-5'>Java</b>的<b class='flag-5'>SPI</b>機(jī)制詳解

    AG32 SPI擴(kuò)展使用

    platformio.ini 的 logic 選項(xiàng): C. 生成 logic 出來(lái)(點(diǎn) prepare LOGIC): D. 復(fù)制上邊準(zhǔn)備好的 full_duplex_spi.v,覆蓋掉 logic 剛生成
    發(fā)表于 05-28 11:19

    聊聊Dubbo - Dubbo可擴(kuò)展機(jī)制實(shí)戰(zhàn)

    是對(duì)Dubbo的擴(kuò)展機(jī)制有一個(gè)基本的了解。如果對(duì)Java SPI比較了解的同學(xué),可以跳過(guò)。Java SPI(Service Provider
    發(fā)表于 06-04 17:33

    嵌入式Linux系統(tǒng)內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)

    運(yùn)行時(shí)由JVM(Java VirtualMachine)動(dòng)態(tài)地加載。Liao等人在1996年提出,將JVM插入到微內(nèi)核,從而可以讓用戶(hù)編寫(xiě)Java程序,以
    發(fā)表于 10-26 09:22

    嵌入式Linux系統(tǒng)內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)

    運(yùn)行時(shí)由JVM(Java VirtualMachine)動(dòng)態(tài)地加載。Liao等人在1996年提出,將JVM插入到微內(nèi)核,從而可以讓用戶(hù)編寫(xiě)Java程序,以
    發(fā)表于 10-28 09:53

    嵌入式Linux系統(tǒng)內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)

    嵌入式Linux系統(tǒng)內(nèi)核抽象的動(dòng)態(tài)擴(kuò)展技術(shù)隨著嵌入式技術(shù)的快速發(fā)展和嵌入式設(shè)備的普及,嵌入式應(yīng)用發(fā)展的一個(gè)關(guān)鍵趨勢(shì)是從靜態(tài)的、固定的系統(tǒng)功能到動(dòng)態(tài)的、可
    發(fā)表于 04-04 17:12

    java動(dòng)態(tài)代理機(jī)制和作用

    的我們的功能,我們更需要學(xué)習(xí)的是其底層是怎么樣的一個(gè)原理,而AOP的原理就是java動(dòng)態(tài)代理機(jī)制,所以本篇隨筆就是對(duì)java動(dòng)態(tài)機(jī)制進(jìn)行一個(gè)回顧。 在
    發(fā)表于 09-27 14:37 ?0次下載

    java動(dòng)態(tài)代理分析

    定義:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。 動(dòng)態(tài)代理使用 java動(dòng)態(tài)代理機(jī)制以巧妙的方式實(shí)現(xiàn)了代理模式的設(shè)計(jì)理念。 代理模式示例代碼 publicinterfaceSubject
    發(fā)表于 09-27 15:14 ?0次下載

    英創(chuàng)信息技術(shù)JAVA操作英創(chuàng)主板SPI接口簡(jiǎn)介

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

    Java實(shí)驗(yàn):類(lèi)和對(duì)象的擴(kuò)展

    Java實(shí)驗(yàn):類(lèi)和對(duì)象的擴(kuò)展
    發(fā)表于 07-08 15:36 ?20次下載
    <b class='flag-5'>Java</b>實(shí)驗(yàn):類(lèi)和對(duì)象的<b class='flag-5'>擴(kuò)展</b>

    源碼級(jí)深度理解Java SPI

    SPI 配置:Java SPI 機(jī)制約定的配置文件,提供查找服務(wù)實(shí)現(xiàn)類(lèi)的邏輯。配置文件必須置于 META-INF/services 目錄,并且,文件名應(yīng)與服務(wù)提供者接口的完全限定名保
    的頭像 發(fā)表于 11-15 11:38 ?846次閱讀

    基于spring的SPI擴(kuò)展機(jī)制是如何實(shí)現(xiàn)的?

    基本上,你一說(shuō)是基于 spring 的 SPI 擴(kuò)展機(jī)制,再把spring.factories文件和EnableAutoConfiguration提一,那么這個(gè)問(wèn)題就答的八九不離十了。
    的頭像 發(fā)表于 03-07 09:17 ?1305次閱讀

    JavaSPI動(dòng)態(tài)擴(kuò)展(上)

    基本上,你一說(shuō)是基于spring的SPI擴(kuò)展機(jī)制,再把`spring.factories`文件和`EnableAutoConfiguration`提一,那么這個(gè)問(wèn)題就答的八九不離十了。
    的頭像 發(fā)表于 03-24 14:27 ?617次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>的<b class='flag-5'>SPI</b><b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>擴(kuò)展</b>(上)

    Java、Spring、Dubbo三者SPI機(jī)制的原理和區(qū)別

    其實(shí)我之前寫(xiě)過(guò)一篇類(lèi)似的文章,但是這篇文章主要是剖析dubbo的SPI機(jī)制的源碼,中間只是簡(jiǎn)單地介紹了一Java、Spring的SPI機(jī)制,并沒(méi)有進(jìn)行深入,所以本篇就來(lái)深入聊一聊這三
    的頭像 發(fā)表于 06-05 15:21 ?1296次閱讀
    <b class='flag-5'>Java</b>、Spring、Dubbo三者<b class='flag-5'>SPI</b>機(jī)制的原理和區(qū)別

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

    SPI 全稱(chēng) Service Provider Interface,是 Java 提供的一套用來(lái)被第三方實(shí)現(xiàn)或者擴(kuò)展的 API,它可以用來(lái)啟用框架擴(kuò)展和替換組件。
    的頭像 發(fā)表于 09-02 09:58 ?1653次閱讀
    <b class='flag-5'>SPI</b>是什么?<b class='flag-5'>Java</b> <b class='flag-5'>SPI</b>的使用介紹