java中spi使用詳解
一、簡(jiǎn)介
java中spi(service provider interface)是jdk內(nèi)置的一種服務(wù)發(fā)現(xiàn)機(jī)制,可以基于配置,在運(yùn)行時(shí)加載指定服務(wù)。java中提供了很多服務(wù)提供接口,如jdbc、jndi等。
1.什么是SPI
SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實(shí)現(xiàn)或者擴(kuò)展的接口,它可以用來啟用框架擴(kuò)展和替換組件。 SPI的作用就是為這些被擴(kuò)展的API尋找服務(wù)實(shí)現(xiàn)。
2.SPI和API的使用場(chǎng)景
API (Application Programming Interface)在大多數(shù)情況下,都是實(shí)現(xiàn)方制定接口并完成對(duì)接口的實(shí)現(xiàn),調(diào)用方僅僅依賴接口調(diào)用,且無權(quán)選擇不同實(shí)現(xiàn)。 從使用人員上來說,API 直接被應(yīng)用開發(fā)人員使用。
SPI (Service Provider Interface)是調(diào)用方來制定接口規(guī)范,提供給外部來實(shí)現(xiàn),調(diào)用方在調(diào)用時(shí)則選擇自己需要的外部實(shí)現(xiàn)。 從使用人員上來說,SPI 被框架擴(kuò)展人員使用。
二、開發(fā)步驟
spi開發(fā)中,涉及接口、實(shí)現(xiàn)類、配置文件和服務(wù)加載,具體開發(fā)步驟如下:
定義接口和實(shí)現(xiàn)類(可多個(gè));
在項(xiàng)目resources目錄下創(chuàng)建META-INF/services文件夾,接著在services文件夾下創(chuàng)建以接口完整類路徑名(包含包路徑和接口名)為文件名的文件,文件內(nèi)容為需要加載的服務(wù)(實(shí)現(xiàn)類)的完整類路徑名,一行一個(gè);
目錄結(jié)構(gòu)類似:
resources-- |-services-- |-com.dragon.study.spring_boot_main.spi.Hello
文件內(nèi)容類似:
com.dragon.study.spring_boot_main.spi.HelloOne com.dragon.study.spring_boot_main.spi.HelloTwo
在啟動(dòng)類中加載服務(wù),代碼類似:
//加載方式一 Iterator<Hello> it = Service.providers(Hello.class); while(it.hasNext()){ it.next().hello(); } //加載方式二 ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class); for (Hello h : hellos){ h.hello(); }
三、使用示例
3.1 定義接口和實(shí)現(xiàn)類
接口:
package com.dragon.study.spring_boot_main.spi; public interface Hello { void hello(); }
實(shí)現(xiàn)類一:
package com.dragon.study.spring_boot_main.spi; public class HelloOne implements Hello { @Override public void hello() { System.out.println("hello one"); } }
實(shí)現(xiàn)類二:
package com.dragon.study.spring_boot_main.spi; public class HelloTwo implements Hello { @Override public void hello() { System.out.println("hello two"); } }
3.2 定義配置文件
在resources/META-INF/services目錄下創(chuàng)建配置文件com.dragon.study.spring_boot_main.spi.Hello,內(nèi)容如下:
com.dragon.study.spring_boot_main.spi.HelloOne com.dragon.study.spring_boot_main.spi.HelloTwo
3.3 啟動(dòng)類中加載服務(wù)
package com.dragon.study.spring_boot_main.spi; import sun.misc.Service; import java.util.Iterator; import java.util.ServiceLoader; public class SpiMain { public static void main(String[] args) { //加載方式一 // Iterator<Hello> it = Service.providers(Hello.class); // while(it.hasNext()){ // it.next().hello(); // } //加載方式二 ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class); for (Hello h : hellos){ h.hello(); } } }
啟動(dòng)后輸出:
hello one
hello two
總結(jié)
到此這篇關(guān)于java中spi使用的文章就介紹到這了,更多相關(guān)java中spi使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot整合Flowable6.x導(dǎo)出bpmn20的步驟詳解
這篇文章主要介紹了Springboot整合Flowable6.x導(dǎo)出bpmn20,Flowable流程引擎可用于部署B(yǎng)PMN 2.0流程定義,可以十分靈活地加入你的應(yīng)用/服務(wù)/構(gòu)架,本文給出兩種從flowable導(dǎo)出流程定義bpmn20.xml的方式,需要的朋友可以參考下2023-04-04Java中內(nèi)部類使用方法實(shí)戰(zhàn)案例分析
這篇文章主要介紹了Java中內(nèi)部類使用方法,結(jié)合具體案例形式分析了Java內(nèi)部類原理、調(diào)用方法及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2019-09-09java學(xué)習(xí)筆記_關(guān)于字符串概述
下面小編就為大家?guī)硪黄猨ava學(xué)習(xí)筆記_關(guān)于字符串概述。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑
本文主要介紹了SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05