精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

Java中的SPI動態擴展(上)

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

八股文背多了,相信大家都聽說過一個詞, SPI擴展 。

有的面試官就很喜歡問這個問題,SpringBoot的自動裝配是如何實現的?

基本上,你一說是基于spring的SPI擴展機制,再把spring.factories文件和EnableAutoConfiguration提一下,那么這個問題就答的八九不離十了。

就像四五年前,我去面試的時候被問到這個問題,SPI動態擴展機制這幾個詞從嘴里一說出來,就把面試官唬的一愣一愣的??赡芩麄円矝]見過這么能裝逼的,一句話能簡簡單單說明白,非要拽一個聽上去很高大上的詞。

話說回來,被唬住的可不止是面試官,其實還有我自己。至于SPI擴展究竟是個啥,是怎么實現的,我當時也根本不明白。

不過現在的面試就是這樣,對線八股文,要想唬住面試官,就得先唬住自己。

那么我們今天暫且不提spring的SPI擴展,先來看看java本身自帶的SPI擴展機制是怎么一回事。

1、簡介

SPI的全稱是Service Provider Interface,翻譯過來就是 服務提供者的接口 ,它所實現的其實是一種服務的發現機制。

這么說起來可能還是有點不好理解,我舉個例子來類比一下。

在spring項目中,寫service層代碼前,會約定俗成的會添加一個接口層。然后通過spring中的依賴注入,可以借助@Autowired等方式注入這個接口的實現類的實例對象,之后對于service的調用一般也基于接口操作。

簡單形容就是這樣的:

圖片

如圖所示,接口、實現類都是由服務提供方提供,我們可以把controller看作服務調用者,調用方只管調用接口就可以了。

雖然也有聲音認為,大部分情況下service只有一個實現類,接口層顯得有些多余。但是在《Head First Design Patterns》這本書中,大佬們還是建議過:

Program to an interface, not an implementation.

沒錯,就是常說的 要面向接口編程 。至于好處,也不外乎是降低耦合度、方便日后擴展、提高了代碼的靈活性和可維護性等等。

在上面這個例子里,這個接口層和其中的方法我們可以稱之為 API ,而我們要討論的SPI和它相比,有類似也有差異,還是先看圖:

圖片

簡單來說,就是服務的調用方定義一個接口規范,可以由不同的服務提供者實現。并且,調用方能夠通過某種機制來發現服務提供方,并通過接口調用它的能力。

通過對比,我們可以看出它們雖然都有著接口這一層面,但還是有很大的不同:

API中的接口是服務提供者給服務調用者的一個功能列表,而SPI中更多強調的是,服務調用者對服務實現的一種約束,服務提供者根據這種約束實現的服務,可以被服務調用者發現。

說白了,Java中的SPI實現的就是,你按我的接口規范實現服務,我就能通過某種機制為這個接口尋找到這個服務。

這么說起來可能還有些抽象,下面我們舉一個例子,類比具體描述一下這個過程。

2、定義接口

說起智能家居系統,大家現在都比較熟悉了,只要是相同品牌下的產品,連上wifi就能夠通過手機app控制了,非常方便。

雖然產品不斷更新換代,型號更新層出不窮,但是同種家電在app上操作起來,功能一般都是一樣的。就拿空調來說,我們在app上操作起來一般也就三個主要功能: 開關選模式 , 調節溫度

假設我現在在客廳、臥室、書房安裝了3款不同型號的空調,并把它們都接入到了我app中,那么之后的操作都是相同的幾個按鍵,簡單粗暴。

圖片

思考一下,無論是開關還是調溫,都是通過app去調用設備的接口罷了,那么如果不同型號的空調各寫各的接口,后端app在開發的時候光對接接口都麻煩的要死。

解決方法也很簡單,我先定義一套接口規范,不管你以后什么型號的空調,都按我的規范來實現接口。以后只要我能發現你的設備,那么都可以按相同的方法來調用接口。

那么下面就先來定義這么一套接口規范,如果你以后想要接入智能家居系統,那么就要遵循這個規范來開發接口。

新建一個項目作為標準,就叫aircondition-standard好了,然后創建一個接口。除了3個操作以外,我們再添加一個獲取空調型號的方法。

public interface IAircondition {
    // 獲取型號
    String getType();
    
    // 開關
    void turnOnOff();

    // 調節溫度
    void adjustTemperature(int temperature);

    // 模式變更
    void changeModel(int modelId);
}

這個接口后面要給服務的實現方來使用,用maven把它打成jar包:

mvn clean install

之后服務提供者在項目中就可以引入這個jar包了,有了這套規范,就保證了產品后期不管怎么更新換代,都能接入到系統來。

3、服務實現

制定并發布完規則后,掛式空調作為第一個服務提供者就來了,新建一個項目aircondition-hanging-type,并引入剛才打好的jar包:

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

創建服務類,并實現前面定義的接口:

public class HangingTypeAircondition
        implements IAircondition{
    public String getType() {
        return "HangingType";
    }
    
    public void turnOnOff() {
        System.out.println("掛式空調開關");
    }

    public void adjustTemperature(int i) {
        System.out.println("掛式空調調節溫度");
    }

    public void changeModel(int i) {
        System.out.println("掛式空調更換模式");
    }
}

在項目的resources的目錄下,創建META-INF/services目錄,然后以前面定義的接口名com.cn.hydra.IAircondition創建文件,并在文件中寫入實現類的全限定名。

com.cn.hydra.HangingTypeAircondition

整個項目結構非常簡單:

圖片

這樣,一個服務方的簡單實現就搞定了,用maven打成jar包,之后就可以提供給調用方使用了。

同理,我們可以再創建一個立式空調的項目aircondition-vertical-type,也只創建一個服務類:

public class VerticalTypeAircondition
        implements IAircondition{
    public String getType() {
        return "VerticalType";
    }
    
    public void turnOnOff() {
        System.out.println("立式空調開關");
    }

    public void adjustTemperature(int i) {
        System.out.println("立式空調調節溫度");
    }

    public void changeModel(int i) {
        System.out.println("立式空調更換模式");
    }
}

還是按上面的命名規則,創建一個配置文件:

com.cn.hydra.VerticalTypeAircondition

同樣,打成jar包就完事了,至于服務調用者如何去發現和調用這兩個服務,下面詳細再說。

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

    關注

    19

    文章

    2958

    瀏覽量

    104544
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1700

    瀏覽量

    91321
  • 代碼
    +關注

    關注

    30

    文章

    4747

    瀏覽量

    68349
  • spring
    +關注

    關注

    0

    文章

    338

    瀏覽量

    14308
收藏 人收藏

    評論

    相關推薦

    JAVA操作英創主板SPI接口簡介

    的個數,每一個SPITransfer需要用戶自己實例化?! ∽詈?,使用完畢后關閉SPI設備:  spi.Close();5、SPI測試程序運行結果運行SPI傳輸
    發表于 10-20 13:16

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

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

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

    能下降。另外,微內核與傳統的嵌入式Linux內核在結構是完全不同的。在嵌入式Linux,如果采用該技術來增加系統的動態擴展性能,需要對內核結構重新設計。  (2)可
    發表于 10-26 09:22

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

    能下降。另外,微內核與傳統的嵌入式Linux內核在結構是完全不同的。在嵌入式Linux,如果采用該技術來增加系統的動態擴展性能,需要對內核結構重新設計?! ?2)可
    發表于 10-28 09:53

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

    的切換和自陷次數增加,導致系統負載增加,系統性能下降。另外,微內核與傳統的嵌入式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 ?1881次閱讀
    英創信息技術<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 ?642次閱讀

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

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

    JavaSPI動態擴展(下)

    基本,你一說是基于spring的SPI擴展機制,再把`spring.factories`文件和`EnableAutoConfiguration`提一下,那么這個問題就答的八九不離十了。
    的頭像 發表于 03-24 14:27 ?537次閱讀
    <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程序內存密碼的安全

    開發和構建簡單?;?SPI 的純 Java 編程模型,一鍵式構建,將 Java 機密計算開發構建門檻一降到底。
    發表于 04-20 12:49 ?912次閱讀

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

    SPI 全稱 Service Provider Interface,是 Java 提供的一套用來被第三方實現或者擴展的 API,它可以用來啟用框架擴展和替換組件。
    的頭像 發表于 09-02 09:58 ?1346次閱讀
    <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 ?653次閱讀
    <b class='flag-5'>java</b>本身自帶的<b class='flag-5'>SPI</b><b class='flag-5'>擴展</b>機制是怎么一回事?