java中spi使用詳解
一、簡介
java中spi(service provider interface)是jdk內置的一種服務發(fā)現機制,可以基于配置,在運行時加載指定服務。java中提供了很多服務提供接口,如jdbc、jndi等。
1.什么是SPI
SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實現或者擴展的接口,它可以用來啟用框架擴展和替換組件。 SPI的作用就是為這些被擴展的API尋找服務實現。
2.SPI和API的使用場景
API (Application Programming Interface)在大多數情況下,都是實現方制定接口并完成對接口的實現,調用方僅僅依賴接口調用,且無權選擇不同實現。 從使用人員上來說,API 直接被應用開發(fā)人員使用。
SPI (Service Provider Interface)是調用方來制定接口規(guī)范,提供給外部來實現,調用方在調用時則選擇自己需要的外部實現。 從使用人員上來說,SPI 被框架擴展人員使用。
二、開發(fā)步驟
spi開發(fā)中,涉及接口、實現類、配置文件和服務加載,具體開發(fā)步驟如下:
定義接口和實現類(可多個);
在項目resources目錄下創(chuàng)建META-INF/services文件夾,接著在services文件夾下創(chuàng)建以接口完整類路徑名(包含包路徑和接口名)為文件名的文件,文件內容為需要加載的服務(實現類)的完整類路徑名,一行一個;
目錄結構類似:
resources-- |-services-- |-com.dragon.study.spring_boot_main.spi.Hello
文件內容類似:
com.dragon.study.spring_boot_main.spi.HelloOne com.dragon.study.spring_boot_main.spi.HelloTwo
在啟動類中加載服務,代碼類似:
//加載方式一 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 定義接口和實現類
接口:
package com.dragon.study.spring_boot_main.spi; public interface Hello { void hello(); }
實現類一:
package com.dragon.study.spring_boot_main.spi; public class HelloOne implements Hello { @Override public void hello() { System.out.println("hello one"); } }
實現類二:
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,內容如下:
com.dragon.study.spring_boot_main.spi.HelloOne com.dragon.study.spring_boot_main.spi.HelloTwo
3.3 啟動類中加載服務
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(); } } }
啟動后輸出:
hello one
hello two
總結
到此這篇關于java中spi使用的文章就介紹到這了,更多相關java中spi使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot整合Flowable6.x導出bpmn20的步驟詳解
這篇文章主要介紹了Springboot整合Flowable6.x導出bpmn20,Flowable流程引擎可用于部署B(yǎng)PMN 2.0流程定義,可以十分靈活地加入你的應用/服務/構架,本文給出兩種從flowable導出流程定義bpmn20.xml的方式,需要的朋友可以參考下2023-04-04SpringBoot中使用@scheduled定時執(zhí)行任務的坑
本文主要介紹了SpringBoot中使用@scheduled定時執(zhí)行任務的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05