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全稱(chēng)Service Provider Interface,是Java提供的一套用來(lái)被第三方實(shí)現(xiàn)或者擴(kuò)展的接口,它可以用來(lái)啟用框架擴(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)用方僅僅依賴(lài)接口調(diào)用,且無(wú)權(quán)選擇不同實(shí)現(xiàn)。 從使用人員上來(lái)說(shuō),API 直接被應(yīng)用開(kāi)發(fā)人員使用。
SPI (Service Provider Interface)是調(diào)用方來(lái)制定接口規(guī)范,提供給外部來(lái)實(shí)現(xiàn),調(diào)用方在調(diào)用時(shí)則選擇自己需要的外部實(shí)現(xiàn)。 從使用人員上來(lái)說(shuō),SPI 被框架擴(kuò)展人員使用。
二、開(kāi)發(fā)步驟
spi開(kāi)發(fā)中,涉及接口、實(shí)現(xiàn)類(lèi)、配置文件和服務(wù)加載,具體開(kāi)發(fā)步驟如下:
定義接口和實(shí)現(xiàn)類(lèi)(可多個(gè));
在項(xiàng)目resources目錄下創(chuàng)建META-INF/services文件夾,接著在services文件夾下創(chuàng)建以接口完整類(lèi)路徑名(包含包路徑和接口名)為文件名的文件,文件內(nèi)容為需要加載的服務(wù)(實(shí)現(xiàn)類(lèi))的完整類(lèi)路徑名,一行一個(gè);
目錄結(jié)構(gòu)類(lèi)似:
resources-- |-services-- |-com.dragon.study.spring_boot_main.spi.Hello
文件內(nèi)容類(lèi)似:
com.dragon.study.spring_boot_main.spi.HelloOne com.dragon.study.spring_boot_main.spi.HelloTwo
在啟動(dòng)類(lèi)中加載服務(wù),代碼類(lèi)似:
//加載方式一 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)類(lèi)
接口:
package com.dragon.study.spring_boot_main.spi; public interface Hello { void hello(); }
實(shí)現(xiàn)類(lèi)一:
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)類(lèi)二:
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)類(lèi)中加載服務(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-04SpringBoot2整合ElasticJob框架過(guò)程詳解
這篇文章主要介紹了SpringBoot2整合ElasticJob框架過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03學(xué)習(xí)Java中Class類(lèi)及其用法
這篇文章分為三大部分,主要內(nèi)容有Class類(lèi)原理詳解、用法及泛化,需要的朋友可以參考下2015-07-07Java中內(nèi)部類(lèi)使用方法實(shí)戰(zhàn)案例分析
這篇文章主要介紹了Java中內(nèi)部類(lèi)使用方法,結(jié)合具體案例形式分析了Java內(nèi)部類(lèi)原理、調(diào)用方法及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2019-09-09java學(xué)習(xí)筆記_關(guān)于字符串概述
下面小編就為大家?guī)?lái)一篇java學(xué)習(xí)筆記_關(guān)于字符串概述。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑
本文主要介紹了SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05