最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中SPI服務(wù)提供者的接口使用總結(jié)

 更新時間:2024年10月11日 11:50:45   作者:醉臥雕龍舫 、  
SPI英文全稱為Service?Provider?Interface,顧名思義,服務(wù)提供者接口,它是jdk提供給“服務(wù)提供廠商”或者“插件開發(fā)者”使用的接口

一:什么是SPI

SPI:“服務(wù)提供者的接口”,是一種服務(wù)發(fā)現(xiàn)機制

用于實現(xiàn)框架或庫的擴展點,允許在運行時動態(tài)地插入或更換組件實現(xiàn)。

它提供了一個框架(JDK1.6后ServiceLoader)來發(fā)現(xiàn)和加載服務(wù)實現(xiàn),使得軟件模塊能夠靈活地選擇和使用不同的服務(wù)提供商。

在這里插入圖片描述

在java中通俗講就是:

  • 對框架或第三方j(luò)ar包提供者來說可制定規(guī)范,提供給開發(fā)者可擴展性
  • 對開發(fā)者來說可以根據(jù)需要輕松替換框架或第三方j(luò)ar包中提供了SPI機制的接口的實現(xiàn)

在AJ-Captcha與Nacos中均提供了SPI擴展。

二:java SPI示例

1.SPI服務(wù)提供方

SPI服務(wù)提供方架構(gòu)圖:

在這里插入圖片描述

定義接口規(guī)范:

public interface SpiService {
    /**
     * 呼叫方式
     */
    void call();
}

加載具體的服務(wù)實現(xiàn):

package com.lmy.config;

import com.lmy.service.SpiService;

import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;

/**
 * @author : lmy
 * @date : 2024/9/14 上午 11:35
 * 加載具體的服務(wù)實現(xiàn)
 */
public class SpiServiceLoader {
    private static volatile SpiServiceLoader LOADER;

    private final SpiService spiService;

    private final List<SpiService> spiServiceList;

    /**
     * 加載服務(wù)
     * */
    private SpiServiceLoader() {
        ServiceLoader<SpiService> loader = ServiceLoader.load(SpiService.class);
        List<SpiService> list = new ArrayList<>();
        for (SpiService spiService : loader) {
            list.add(spiService);
        }
        spiServiceList = list;
        if (!list.isEmpty()) {
            // 取第一個
            spiService = list.get(0);
        } else {
            spiService = null;
        }
    }

    /**
     * SpiServiceLoader 單例加載
     * */
    public static SpiServiceLoader getLOADER() {
        if (LOADER == null) {
            synchronized (SpiServiceLoader.class) {
                if (LOADER == null) {
                    LOADER = new SpiServiceLoader();
                }
            }
        }
        return LOADER;
    }


    public void call(){
        if(spiServiceList.isEmpty()){
            System.out.println("SpiService服務(wù)未加載!");
        }else {
            SpiService spiService = spiServiceList.get(0);
            spiService.call();
        }
    }

}

默認實現(xiàn):

package com.lmy.service.impl;

import com.lmy.service.SpiService;

/**
 * @author : lmy
 * @date : 2024/9/14 上午 10:58
 * 默認實現(xiàn)
 */
public class SpiServiceImpl implements SpiService {
    @Override
    public void call() {
        System.out.println("默認手機呼叫");
    }
}

指定服務(wù)實現(xiàn)方式:
須在resource下創(chuàng)建META-INF.services,文件名為接口全限定類名,配置為需要被加載的接口實現(xiàn)類的全限定類名

在這里插入圖片描述

com.lmy.service.impl.SpiServiceImpl

項目打包發(fā)布本地:

在這里插入圖片描述

2.SPI服務(wù)應(yīng)用方開發(fā)者

開發(fā)者引入jar包使用服務(wù):

<dependency>
    <groupId>com.lmy</groupId>
    <artifactId>SPI-interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
package com.lmy.Spi;

import com.lmy.config.SpiServiceLoader;
import org.junit.Test;

/**
 * @author : lmy
 * @date : 2024/9/14 上午 11:48
 */
public class SpiTest {

    @Test
    public void spiTest () {
        SpiServiceLoader loader = SpiServiceLoader.getLOADER();
        loader.call();
    }
}

執(zhí)行結(jié)果:

在這里插入圖片描述

開發(fā)者根據(jù)需要擴展替換為自己的服務(wù)實現(xiàn):

package com.lmy.Spi.service;

import com.lmy.service.SpiService;

/**
 * @author : lmy
 * @date : 2024/9/14 下午 2:09
 */
public class SpiServiceNewImpl implements SpiService {
    @Override
    public void call() {
        System.out.println("衛(wèi)星直呼");
    }
}

在這里插入圖片描述

com.lmy.Spi.service.SpiServiceNewImpl

執(zhí)行結(jié)果:

在這里插入圖片描述

三:JavaSPI 機制的核心-ServiceLoader

上面代碼可見是通過ServiceLoader 去加載具體的服務(wù)實現(xiàn)的

在這里插入圖片描述

ServiceLoader 是從JDK1.6 開始提供的一個類,用于加載服務(wù)提供者。

進入源碼可見:
其中 String PREFIX = “META-INF/services/”;
這個就是JDK的SPI功能規(guī)定的具體服務(wù)實現(xiàn)的配置信息文件所在的目錄 META-INF/services/

在這里插入圖片描述

JDK的SPI規(guī)定 服務(wù)實現(xiàn)者需要在 META-INF/services/ 目錄下 新建文件名為 SPI接口全限定類名的文件
文件內(nèi)容為 服務(wù)實現(xiàn)者需要被加載的具體類的全限定類名

到此這篇關(guān)于java中SPI服務(wù)提供者的接口使用總結(jié)的文章就介紹到這了,更多相關(guān)java spi詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java持久層框架Mybatis入門詳細教程

    Java持久層框架Mybatis入門詳細教程

    Mybatis持久層框架支持自定義SQL、存儲過程以及高級映射,可以通過XML或注解來配置和映射原始類型、接口和Java POJOs為數(shù)據(jù)庫中的記錄,接下來通過本文給大家介紹Java持久層框架Mybatis入門詳細教程,一起學(xué)習(xí)下吧
    2021-06-06
  • mybatis配置獲取自增主鍵的操作方法

    mybatis配置獲取自增主鍵的操作方法

    當需要剛剛插入數(shù)據(jù)庫的數(shù)據(jù)對應(yīng)的新增主鍵時,通過配置xml文件,使數(shù)據(jù)庫返回新增主鍵id,并把主鍵id與類參數(shù)對應(yīng),本文給大家介紹了mybatis配置獲取自增主鍵的操作方法,需要的朋友可以參考下
    2024-05-05
  • 使用Apache Ignite實現(xiàn)Java數(shù)據(jù)網(wǎng)格

    使用Apache Ignite實現(xiàn)Java數(shù)據(jù)網(wǎng)格

    今天我們來探討如何使用Apache Ignite來實現(xiàn)Java數(shù)據(jù)網(wǎng)格,Apache Ignite是一個高性能的內(nèi)存計算平臺,它提供了分布式緩存、數(shù)據(jù)網(wǎng)格和計算功能,可以顯著提高大規(guī)模應(yīng)用的數(shù)據(jù)處理性能,感興趣的小伙伴跟著小編一起來看看吧
    2024-08-08
  • 解決mybatis 執(zhí)行mapper的方法時報空指針問題

    解決mybatis 執(zhí)行mapper的方法時報空指針問題

    這篇文章主要介紹了解決mybatis 執(zhí)行mapper的方法時報空指針問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java獲取磁盤空間的兩種代碼示例

    Java獲取磁盤空間的兩種代碼示例

    這篇文章主要介紹了Java獲取磁盤空間的兩種代碼示例,沒什么事的時候可以拿來玩玩,需要的朋友參考下。
    2017-11-11
  • 分布式框架Zookeeper?api的使用介紹

    分布式框架Zookeeper?api的使用介紹

    Zookeeper作為?個分布式框架,主要用來解決分布式?致性問題,它提供了簡單的分布式原語,并且對多種編程語?提供了API,所以接下來重點來看下Zookeeper的java客戶端API使用方式
    2022-09-09
  • Java中的ScheduledThreadPoolExecutor定時任務(wù)詳解

    Java中的ScheduledThreadPoolExecutor定時任務(wù)詳解

    這篇文章主要介紹了Java中的ScheduledThreadPoolExecutor詳解,??ScheduledThreadPoolExecutor?繼承自?ThreadPoolExecutor,它主要用來在給定的延遲之后運行任務(wù),或者定期執(zhí)行任務(wù),ScheduledThreadPoolExecutor?的功能與?Timer?類似<BR>,需要的朋友可以參考下
    2023-12-12
  • Java中該如何優(yōu)雅的使用線程池詳解

    Java中該如何優(yōu)雅的使用線程池詳解

    在java開發(fā)中我們對“池”的概念并不陌生,常見的有數(shù)據(jù)庫連接池、線程池、對象池、常量池等等,其作用基本上就是避免頻繁的創(chuàng)建和回收,造成資源浪費,線程池也不例外,這篇文章主要給大家介紹了關(guān)于Java中該如何優(yōu)雅的使用線程池的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • 詳解Spring Security 中的四種權(quán)限控制方式

    詳解Spring Security 中的四種權(quán)限控制方式

    這篇文章主要介紹了詳解Spring Security 中的四種權(quán)限控制方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Struts2的配置文件方法小結(jié)

    Struts2的配置文件方法小結(jié)

    最近正在學(xué)習(xí)Struts2,在配置文件中遇到好多標簽,各種意義不同。下面這篇文章就來給大家介紹關(guān)于Struts2配置文件的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04

最新評論

友谊县| 邢台市| 乡城县| 屯留县| 天水市| 寿阳县| 古丈县| 鹰潭市| 安丘市| 宜兰市| 许昌县| 湘阴县| 十堰市| 贵州省| 乌苏市| 荆州市| 介休市| 蒲江县| 武宣县| 津南区| 汾西县| 宜都市| 丰城市| 井冈山市| 靖州| 安宁市| 即墨市| 措勤县| 开封县| 临夏市| 清镇市| 甘肃省| 嵊泗县| 雷波县| 江华| 庆阳市| 株洲市| 张掖市| 丹巴县| 峨山| 吴桥县|