电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java進(jìn)階之SPI機(jī)制詳解

瀏覽:3日期:2022-08-12 15:13:27
目錄一、前言二、SPI規(guī)范三、SPI應(yīng)用案例3.1 數(shù)據(jù)庫(kù)驅(qū)動(dòng)3.2 Slf4j四、SPI示例4.1 spi-operate-service模塊4.2 spi-operate-add模塊4.3 spi-operate-multiplication模塊4.4 spi-operate-consumer模塊一、前言

SPI的英文全稱為Service Provider Interface,字面意思為服務(wù)提供者接口,它是jdk提供給“服務(wù)提供廠商”或者“插件開(kāi)發(fā)者”使用的接口。

在面向?qū)ο蟮脑O(shè)計(jì)中,模塊之間我們一般會(huì)采取面向接口編程的方式,而在實(shí)際編程過(guò)程過(guò)程中,API的實(shí)現(xiàn)是封裝在jar中,當(dāng)我們想要換一種實(shí)現(xiàn)方法時(shí),還要生成新的jar替換以前的實(shí)現(xiàn)類。而通過(guò)jdk的SPI機(jī)制就可以實(shí)現(xiàn),首先不需要修改原來(lái)作為接口的jar的情況下,將原來(lái)實(shí)現(xiàn)的那個(gè)jar替換為另外一種實(shí)現(xiàn)的jar即可。

總結(jié)一下SPI的思想:在系統(tǒng)的各個(gè)模塊中,往往有不同的實(shí)現(xiàn)方案,例如日志模塊的方案、xml解析的方案等,為了在裝載模塊的時(shí)候不具體指明實(shí)現(xiàn)類,我們需要一種服務(wù)發(fā)現(xiàn)機(jī)制,java spi就提供這樣一種機(jī)制。有點(diǎn)類似于IoC的思想,將服務(wù)裝配的控制權(quán)移到程序之外,在模塊化設(shè)計(jì)時(shí)尤其重要。

順便提一下,Java SPI機(jī)制在很多大型中間件嗎,例如Dubbo中均有采用,屬于高級(jí)Java開(kāi)發(fā)的進(jìn)階必備知識(shí)點(diǎn),務(wù)必要求掌握。

二、SPI規(guī)范

定義服務(wù)的通用接口,針對(duì)通用的服務(wù)接口,提供具體的實(shí)現(xiàn)類。

1.在jar包(服務(wù)提供者)的META-INF/services/目錄中,新建一個(gè)文件,文件名為SPI接口的'全限定名'。 文件內(nèi)容為該接口的具體實(shí)現(xiàn)類的'全限定名'

2.將spi所在jar放在主程序的classpath中

3.服務(wù)調(diào)用方使用java.util.ServiceLoader去動(dòng)態(tài)加載具體的實(shí)現(xiàn)類到JVM中

三、SPI應(yīng)用案例3.1 數(shù)據(jù)庫(kù)驅(qū)動(dòng)

java.sql.Driver的spi實(shí)現(xiàn),有mysql驅(qū)動(dòng)、oracle驅(qū)動(dòng)等。以mysql為例,實(shí)現(xiàn)類是com.mysql.jdbc.Driver,在mysql-connector-java-5.1.6.jar中,我們可以看到有一個(gè)META-INF/services目錄,目錄下有一個(gè)文件名為java.sql.Driver的文件,其中的內(nèi)容是com.mysql.jdbc.Driver。

Java進(jìn)階之SPI機(jī)制詳解

在我們使用JDBC獲取連接時(shí),我們通常會(huì)調(diào)用DriverManager.getConnection()方法獲取連接對(duì)象,而在Driver類初始化時(shí)會(huì)使用ServiceLoader動(dòng)態(tài)獲取classpath下“注冊(cè)”的驅(qū)動(dòng)實(shí)現(xiàn):

static {loadInitialDrivers();println('JDBC DriverManager initialized');}private static void loadInitialDrivers() {.....AccessController.doPrivileged(new PrivilegedAction<Void>() { public Void run() {//使用ServiceLoader動(dòng)態(tài)加載具體的驅(qū)動(dòng)實(shí)現(xiàn)類ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);Iterator<Driver> driversIterator = loadedDrivers.iterator();try{ while(driversIterator.hasNext()) {driversIterator.next(); }} catch(Throwable t) {// Do nothing}return null; }});..... }3.2 Slf4j

Java進(jìn)階之SPI機(jī)制詳解

slf4j是一個(gè)典型的門面接口,早起我們使用log4j作為日記記錄框架,我們需要同時(shí)引入slf4j和log4j的依賴。后面比較流行l(wèi)ogback,我們也想要把項(xiàng)目切換到logback上來(lái),此時(shí)利用SPI的機(jī)制,我們只需要把log4j的jar包替換為logback的jar包就可以了。

在log4j-to-slf4j.jar中我們可以看到前面提到的服務(wù)提供方的SPI接口聲明

Java進(jìn)階之SPI機(jī)制詳解

這樣我們只需要將log4j-to-slf4j.jar引入classpath,slf4j就能夠獲取到org.apache.logging.slf4j.SLF4JProvider作為實(shí)現(xiàn)類。

四、SPI示例

Java進(jìn)階之SPI機(jī)制詳解

模塊依賴關(guān)系:

Java進(jìn)階之SPI機(jī)制詳解

4.1 spi-operate-service模塊

在spi-operate-service中定義INumOperate接口:

package cn.bigcoder.spi.operate.service;/** * @author: Jindong.Tian * @date: 2020-11-29 * @description: **/public interface INumOperate { int exec(int num1, int num2);}4.2 spi-operate-add模塊

在spi-operate-add中定義加法實(shí)現(xiàn):

package cn.bigcoder.spi.operate.add;import cn.bigcoder.spi.operate.service.INumOperate;/** * @author: Jindong.Tian * @date: 2020-11-29 * @description: **/public class NumAddOperateImpl implements INumOperate { public int exec(int num1, int num2) {return num1 + num2; }}

在resource/METAINF/resoures目錄下創(chuàng)建cn.bigcoder.spi.operate.service.INumOperate文件:

cn.bigcoder.spi.operate.add.NumAddOperateImpl4.3 spi-operate-multiplication模塊

在spi-operate-multiplication模塊中定義乘法的實(shí)現(xiàn):

package cn.bigcoder.spi.operate.multiplication;import cn.bigcoder.spi.operate.service.INumOperate;/** * @author: Jindong.Tian * @date: 2020-11-29 * @description: **/public class NumMultiOperateImpl implements INumOperate {public int exec(int num1, int num2) {return num1 * num2; }}

同樣的在resource/METAINF/resoures目錄下創(chuàng)建cn.bigcoder.spi.operate.service.INumOperate文件:

cn.bigcoder.spi.operate.multiplication.NumMultiOperateImpl4.4 spi-operate-consumer模塊

在spi-operate-consumer模塊中,我們編寫測(cè)試類獲取classpath中INumOperate實(shí)現(xiàn)類:

package cn.bigcoder.spi.operate;import cn.bigcoder.spi.operate.service.INumOperate;import org.junit.Test;import java.util.Iterator;import java.util.ServiceLoader;/** * @author: Jindong.Tian * @date: 2020-11-29 * @description: **/public class INumOperateTest { @Test public void test() {// SPI機(jī)制,尋找所有的實(shí)現(xiàn)類,順序執(zhí)行ServiceLoader<INumOperate> loader = ServiceLoader.load(INumOperate.class);Iterator<INumOperate> iterator = loader.iterator();if (iterator.hasNext()) { INumOperate numOperate = iterator.next(); System.out.println(numOperate.exec(1, 2));} else { throw new RuntimeException('classpath中未找到cn.bigcoder.spi.operate.INumOperate實(shí)現(xiàn)類');} }}

此時(shí)如果我們?cè)趕pi-operate-consumer中引入spi-operate-add,則測(cè)試方法執(zhí)行求和操作;如果引入spi-operate-multiplication,則測(cè)試方法執(zhí)行乘法操作。

到此這篇關(guān)于Java進(jìn)階之Java SPI詳解的文章就介紹到這了,更多相關(guān)Java SPI內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 房在线-免费房产管理系统软件-二手房中介房屋房源管理系统软件 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 打造全球沸石生态圈 - 国投盛世| 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 灌装封尾机_胶水灌装机_软管灌装封尾机_无锡和博自动化机械制造有限公司 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 扬子叉车厂家_升降平台_电动搬运车|堆高车-扬子仓储叉车官网 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 智慧旅游_智慧景区_微景通-智慧旅游景区解决方案提供商 | 软文世界-软文推广-软文营销-新闻稿发布-一站式软文自助发稿平台 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 半容积式换热器_北京浮动盘管换热器厂家|北京亿丰上达 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 巩义市科瑞仪器有限公司| 恒温水槽与水浴锅-上海熙浩实业有限公司 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 天坛家具官网 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 电动百叶窗,开窗器,电动遮阳百叶,电动开窗机生产厂家-徐州鑫友工控科技发展有限公司 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 |