国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java的SPI機制與簡單的示例

2019-11-14 23:10:40
字體:
來源:轉載
供稿:網友
java的SPI機制與簡單的示例

一、SPI機制

這里先說下SPI的一個概念,SPI英文為Service PRovider Interface單從字面可以理解為Service提供者接口,正如從SPI的名字去理解SPI就是Service提供者接口;我對SPI的定義:提供給服務提供廠商與擴展框架功能的開發者使用的接口。

在我們日常開發的時候都是對問題進行抽象成Api然后就提供各種Api的實現,這些Api的實現都是封裝與我們的Jar中或框架中的雖然當我們想要提供一種Api新實現時可以不修改原來代碼只需實現該Api就可以提供Api的新實現,但我們還是生成新Jar或框架(雖然可以通過在代碼里掃描某個目錄已加載Api的新實現,但這不是Java的機制,只是hack方法),而通過Java SPI機制我們就可以在不修改Jar包或框架的時候為Api提供新實現。

很多框架都使用了java的SPI機制,如java.sql.Driver的SPI實現(MySQL驅動、Oracle驅動等)、common-logging的日志接口實現、dubbo的擴展實現等等框架;

SPI機制的約定:

1) 在META-INF/services/目錄中創建以接口全限定名命名的文件該文件內容為Api具體實現類的全限定名

2) 使用ServiceLoader類動態加載META-INF中的實現類

3) 如SPI的實現類為Jar則需要放在主程序classPath中

4) Api具體實現類必須有一個不帶參數的構造方法

SPI機制結構圖

二、SPI機制示例

實例結構圖

IOperation接口:

/** * Created by LX on 2015/3/8. */public interface IOperation {    public int operation(int numberA, int numberB);}

PlusOperationImpl實現:

import co.solinx.demo.api.IOperation;/** * Created by LX on 2015/3/8. */public class PlusOperationImpl implements IOperation {    @Override    public int operation(int numberA, int numberB) {        return numberA + numberB;    }}

SPI接口的實現類:DivisionOperationImpl

import co.solinx.demo.api.IOperation;/** * Created by LX on 2015/3/8. */public class DivisionOperationImpl implements IOperation {    @Override    public int operation(int numberA, int numberB) {        return numberA / numberB;    }}

META-INF/Services目錄中的文件:

文件名:co.solinx.demo.api.IOperation,內容:co.solinx.demo.spi.DivisionOperationImpl

Main類:

import co.solinx.demo.api.IOperation;import co.solinx.demo.impl.PlusOperationImpl;import co.solinx.demo.spi.DivisionOperationImpl;import java.util.Iterator;import java.util.ServiceLoader;/** * Created by LX on 2015/3/8. */public class main {    public static void main(String[] args) {        IOperation plus = new PlusOperationImpl();        IOperation division = new DivisionOperationImpl();        System.out.println(plus.operation(5, 3));        System.out.println(division.operation(9, 3));        ServiceLoader<IOperation> operations = ServiceLoader.load(IOperation.class);        Iterator<IOperation> operationIterator = operations.iterator();        System.out.println("classPath:"+System.getProperty("java.class.path"));        while (operationIterator.hasNext()) {            IOperation operation = operationIterator.next();            System.out.println(operation.operation(6, 3));        }    }}

運行結果:

如把SPI實現打包為jar需要把jar放在classpath目錄中,SPI jar包運行結果:

文章首發地址:Solinx

http://www.solinx.co/archives/142


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洮南市| 沂南县| 子洲县| 禹州市| 府谷县| 岳阳市| 泽州县| 商丘市| 房产| 吉林省| 静宁县| 太白县| 萨嘎县| 安西县| 文山县| 宜宾县| 大余县| 定襄县| 博爱县| 泗水县| 桐城市| 桐梓县| 德阳市| 罗城| 阳新县| 甘肃省| 红原县| 碌曲县| 镇康县| 孟津县| 余庆县| 新干县| 元谋县| 融水| 成安县| 怀宁县| 安丘市| 彝良县| 皋兰县| 阿克苏市| 富阳市|