欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

什么是SPI機(jī)制

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 15:03 ? 次閱讀

1、前言

在之前的JVM 分析系列之類加載提到過 Java SPI 機(jī)制,主要是類加載器反雙親委派的實(shí)現(xiàn)(第三方包不在指定jdk路徑,一般類加載器無法加載,需要特殊的ContextClassLoader加載以便使用)。本次將對(duì) SPI機(jī)制進(jìn)行詳解,并結(jié)合案例介紹其在實(shí)際場(chǎng)景中具體使用。

2、什么是SPI機(jī)制?

  • SPI(全稱:Service Provider Interface),是jdk內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)接口機(jī)制,旨在由第三方服務(wù)實(shí)現(xiàn)或擴(kuò)展為組件,方便開發(fā)人員快速集成指定擴(kuò)展組件滿足指定的需求。這對(duì)于應(yīng)用或平臺(tái)擴(kuò)展來說,無疑是一種成本較低、動(dòng)態(tài)靈活的方案。
  • SPI機(jī)制調(diào)度過程(業(yè)務(wù)調(diào)用方可根據(jù)加載的擴(kuò)展實(shí)現(xiàn)類實(shí)現(xiàn)功能)
  • 調(diào)用流程
    圖片

3、實(shí)現(xiàn)方式及使用場(chǎng)景

鑒于目前實(shí)際項(xiàng)目涉及范圍,總結(jié)出的常見應(yīng)用場(chǎng)景。

3.1 接口權(quán)限定文件名方式

  • 即在resource文件下創(chuàng)建META/services/目錄,并在此目錄下新建文件,文件名稱為接口類權(quán)限定文件名,如 com.lgy.spidemo.serviceway.SpiService。(不好理解就是接口類的package地址 + 接口類名)

使用場(chǎng)景一:

  • 場(chǎng)景描述:不同部門類型的員工需要從不同的考勤應(yīng)用獲取出勤信息,如職能部門僅拉取釘釘考勤,業(yè)務(wù)部門需要拉取釘釘考勤的基礎(chǔ)上再結(jié)合自研考勤模塊數(shù)據(jù)匯總出勤結(jié)果。
  • 實(shí)現(xiàn)方式:抽象通用拉取考勤接口,定義不同部門人員考勤統(tǒng)計(jì)實(shí)現(xiàn)類。
  • 直接上代碼:
  • 通用接口:
package com.lgy.spidemo.serviceway;

 /**
  * @description: 考勤接口
  **/
 public interface AttendanceService {
  void pullAttendanceInfos();
 }
  • 職能部門考勤實(shí)現(xiàn)類
/**
  * @description: 職能部門考勤實(shí)現(xiàn)
  **/
 public class FunctionAttendanceServiceImpl implements AttendanceService  {
  @Override
  public void pullAttendanceInfos() {
   System.out.println(" FunctionAttendanceService implements ...");
   // 邏輯忽略
  }
 }
  • 銷售部門考勤實(shí)現(xiàn)
/**
  * @description: 銷售部門考勤實(shí)現(xiàn)
  **/
 public class SaleAttendanceServiceImpl implements AttendanceService  {
  @Override
  public void pullAttendanceInfos() {
   System.out.println(" SaleAttendanceService implements ...");
   // 邏輯忽略
  }
 }
  • 測(cè)試類
/**
  * 1、項(xiàng)目的srcmainresources下創(chuàng)建META-INFservices目錄
  * 2、META-INFservices的目錄下再增加一個(gè)配置文件,這個(gè)文件必須以接口的全限定類名保持一致 (com.lgy.spidemo.service.SpiService)
  * 3、在配置文件中寫入具體實(shí)現(xiàn)類的全限定類名,如有多個(gè)便換行寫入 com.lgy.spidemo.service.impl.SaleAttendanceServiceImpl
 com.lgy.spidemo.service.impl.FunctionAttendanceServiceImpl
  **/
 public class AttendanceServiceTest {
  public static void main(String[] args) {
   ServiceLoader< AttendanceService > services =
      ServiceLoader.load(AttendanceService.class);
   // 省略判斷人員部門類型邏輯
   // 測(cè)試輸出結(jié)果,展示實(shí)現(xiàn)接口已加載
   for (AttendanceService service : services) {
    service.pullAttendanceInfos();
   }
  }
 }
  • 測(cè)試結(jié)果如下
// 兩個(gè)實(shí)現(xiàn)類均被加載成功,在實(shí)際使用時(shí),可根據(jù)需要去調(diào)用不同的實(shí)現(xiàn)。
     FunctionAttendanceService implements ...
     SaleAttendanceService implements ....
  • 實(shí)現(xiàn)類不要標(biāo)注任何注解,不然Spring在初始化過程中掃描并加載,無法測(cè)試。

結(jié)合場(chǎng)景一分析:

  • 此場(chǎng)景可以通過自定義實(shí)現(xiàn)類的方式滿足業(yè)務(wù)需求(不同部門的考勤規(guī)則),有助于業(yè)務(wù)實(shí)現(xiàn)快速迭代,同時(shí)也提升了服務(wù)架構(gòu)的可拓展性。
  • 考慮公司組織架構(gòu)比較復(fù)雜,部門職責(zé)分的比較細(xì),后續(xù)擴(kuò)展幾率比較大,比如職能部門行政類和運(yùn)營(yíng)類標(biāo)準(zhǔn)細(xì)分,很可能會(huì)增加除了考勤之外的各種考核指標(biāo)等,借鑒此方案可能簡(jiǎn)單實(shí)現(xiàn)并比較方便集成,使得業(yè)務(wù)間減少依賴,實(shí)現(xiàn)解耦的設(shè)計(jì)模式,因此個(gè)人是比較偏向用此方案。
  • 其它應(yīng)用:如項(xiàng)目中常用的日志也是采用SPI機(jī)制,常見的common-logging的LogFatory就是標(biāo)準(zhǔn)SPI接口,有興趣的可以自行研究。

3.2 spring.factories方式

  • 和上面一樣,需要在resource文件下創(chuàng)建META/services/目錄,并在此目錄下新建文件,區(qū)別在于文件名為 spring.factories 。

使用場(chǎng)景二

  • 場(chǎng)景描述:針對(duì)于不同的開發(fā)端使用習(xí)慣展示不同的接口文檔,比如APP端習(xí)慣于Swagger,JAVA端喜歡dateway風(fēng)格,就在不同實(shí)例展示不同接口文檔。此場(chǎng)景是我臆想出來。
  • 實(shí)現(xiàn)方式:構(gòu)建兩種版本的jar包,比如 1.0.0-swagger 、2.0.0-dataway,再對(duì)應(yīng)的包內(nèi)配置spring.factories內(nèi)的config配置類。
  • 代碼如下:
package com.lgy.spidemo.factoriesway;

 import org.springframework.boot.autoconfigure.AutoConfigurationImportEvent;
 import org.springframework.boot.autoconfigure.AutoConfigurationImportListener;

 /**
  * @description: 自動(dòng)配置swagger
  **/
 public class SwaggetAutoConfiguration {
  public SwaggetAutoConfiguration() {
   System.out.println(" SwaggetAutoConfiguration init ...");
  }
  // 配置內(nèi)容省略
 }

 /**
  * @description: 自動(dòng)配置dataway
  **/
 public class DataWayAutoConfiguration {
  public DataWayAutoConfiguration() {
   System.out.println(" DataWayAutoConfiguration init ...");
  }
  // 配置內(nèi)容省略
 }

 /**
 * resource/META-INFO/spring.factories 文件內(nèi)容 *
 * org.springframework.boot.autoconfigure.EnableAutoConfiguration=
   com.lgy.spidemo.factoriesway.SwaggetAutoConfiguration
 * 輸出結(jié)果:SwaggetAutoConfiguration init ...
 **/
  • 根據(jù)spring.factories內(nèi)配置的類,在springboot啟動(dòng)初始化過程中會(huì)自動(dòng)加載對(duì)應(yīng)的配置,實(shí)現(xiàn)所需的接口文檔。

結(jié)合場(chǎng)景二分析:

  • spring.factories實(shí)現(xiàn)機(jī)制與上述方式一致,只是實(shí)現(xiàn)方式不同,本質(zhì)目的是通過抽象化類的方式,實(shí)現(xiàn)解耦,最終便于擴(kuò)展
  • 其它使用場(chǎng)景:如spring-boot-autoconfigure-x.x.x.RELEASE.jar,就是通過此方式完成初始化加載。

4、總結(jié)

  • 本次講解的兩種方式均是基于SPI機(jī)制,可見是多么受開發(fā)追捧。當(dāng)然,還有很多種實(shí)現(xiàn)方式,我個(gè)人覺得最主要的還是能夠在自己的掌控范圍內(nèi)去使用,畢竟有問題可以通過自己的學(xué)習(xí)理解去解決。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8712

    瀏覽量

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

    關(guān)注

    17

    文章

    1724

    瀏覽量

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

    關(guān)注

    30

    文章

    4835

    瀏覽量

    69117
  • Package
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    10558
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14398
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于SPI通訊的精講 SPI協(xié)議的特點(diǎn)和工作機(jī)制

    1、SPI協(xié)議簡(jiǎn)介 1.1 SPI協(xié)議概括 SPI,是英語(yǔ)Serial Peripheral interface的縮寫,顧名思義就是串行外圍設(shè)備接口。是Motorola首先在其MC68HCXX系列
    的頭像 發(fā)表于 05-08 19:55 ?9933次閱讀
    關(guān)于<b class='flag-5'>SPI</b>通訊的精講 <b class='flag-5'>SPI</b>協(xié)議的特點(diǎn)和工作<b class='flag-5'>機(jī)制</b>

    SPI總線學(xué)習(xí)筆記

    SPI是一種全雙工的串行通信總線,最早由Motorola提出,雖然應(yīng)用廣泛,但沒有一個(gè)統(tǒng)一的總線標(biāo)準(zhǔn)。相較于IIC總線,SPI具有通信速度快、協(xié)議靈活、無復(fù)雜的總線仲裁機(jī)制、支持中斷等優(yōu)點(diǎn),但缺點(diǎn)也
    發(fā)表于 09-20 15:17 ?1181次閱讀
    <b class='flag-5'>SPI</b>總線學(xué)習(xí)筆記

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

    OSGI容器Dubbo作為一個(gè)框架,不希望強(qiáng)依賴其他的IoC容器,比如Spring,Guice。OSGI也是一個(gè)很重的實(shí)現(xiàn),不適合Dubbo。最終Dubbo的實(shí)現(xiàn)參考了Java原生的SPI機(jī)制,但對(duì)其
    發(fā)表于 06-04 17:33

    SPI是什么?SPI的特點(diǎn)有哪些呢

    SPI是什么?SPI的特點(diǎn)有哪些呢?STM32的SPI工作機(jī)制有哪些呢?
    發(fā)表于 11-03 07:14

    RT_SFUD_SPI_MAX_HZ到底是什么作用機(jī)制呢?

    設(shè)定會(huì)導(dǎo)致spi clk 的波形畸變。設(shè)定 13mhz時(shí)波形:示波器顯示頻率 25mhz設(shè)定 13mhz時(shí)波形:示波器顯示頻率 50mhz疑問:1:RT_SFUD_SPI_MAX_HZ 到底是什么作用機(jī)制2:
    發(fā)表于 04-14 10:08

    SPI模式下MMC卡的讀寫機(jī)制

    SPI模式下MMC卡的讀寫機(jī)制  多媒體卡MMC(MultiMedia Card)是由美國(guó)SanDisk公司和德國(guó)Simens公司于1997年共同開發(fā)的一種多功能Flash存儲(chǔ)設(shè)備?;贏RM7芯
    發(fā)表于 03-29 15:13 ?1233次閱讀
    <b class='flag-5'>SPI</b>模式下MMC卡的讀寫<b class='flag-5'>機(jī)制</b>

    SPI總線協(xié)議的工作機(jī)制解析

    SPI,串行外圍設(shè)備接口,是Motorola公司推出的一種同步串行接口技術(shù).SPI總線在物理上是通過接在外圍設(shè)備微控制器(PICmicro)上面的微處理控制單元(MCU)上叫作同步串行端口
    發(fā)表于 08-25 17:38 ?1439次閱讀
    <b class='flag-5'>SPI</b>總線協(xié)議的工作<b class='flag-5'>機(jī)制</b>解析

    基于SPI協(xié)議的SD卡讀寫機(jī)制與實(shí)現(xiàn)方法

    基于SPI協(xié)議的SD卡讀寫機(jī)制與實(shí)現(xiàn)方法。
    發(fā)表于 03-25 11:21 ?27次下載
    基于<b class='flag-5'>SPI</b>協(xié)議的SD卡讀寫<b class='flag-5'>機(jī)制</b>與實(shí)現(xiàn)方法

    SPI通信簡(jiǎn)介

    目錄(?)[-]SPI簡(jiǎn)介SPI特點(diǎn)1采用主-從模式Master-Slave 的控制方式2采用同步方式Synchronous傳輸數(shù)據(jù)3數(shù)據(jù)交換Data Exchanges4 SPI有四種傳輸模式5
    發(fā)表于 12-22 19:14 ?9次下載
    <b class='flag-5'>SPI</b>通信簡(jiǎn)介

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

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

    JDK內(nèi)置的一種服務(wù)SPI機(jī)制

    SPI(Service Provider Interface)是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來啟用框架擴(kuò)展和替換組件,主要用于框架中開發(fā),例如Dubbo、Spring
    的頭像 發(fā)表于 02-15 09:15 ?838次閱讀

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

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

    可插拔組件設(shè)計(jì)機(jī)制SPI介紹

    SPI 的全稱是 Service Provider Interface, 即提供服務(wù)接口;是一種服務(wù)發(fā)現(xiàn)機(jī)制,SPI 的本質(zhì)是將接口實(shí)現(xiàn)類的全限定名配置在文件中,并由服務(wù)加載器讀取配置文件,加載實(shí)現(xiàn)類。
    的頭像 發(fā)表于 03-23 09:20 ?1212次閱讀

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

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

    SPI傳輸原理 SPI傳輸機(jī)制

    SPI 傳輸機(jī)制 從圖可以看出,主機(jī)和從機(jī)都有一個(gè)串行移位寄存器,主機(jī)通過向它的 SPI 串行寄存器寫入一個(gè)字節(jié)來發(fā)起一次傳輸。寄存器通過 MOSI 信號(hào)線將字節(jié)傳送給從機(jī),從機(jī)也將自己的移位寄存器
    的頭像 發(fā)表于 07-27 10:43 ?2674次閱讀
    <b class='flag-5'>SPI</b>傳輸原理 <b class='flag-5'>SPI</b>傳輸<b class='flag-5'>機(jī)制</b>