程序員之Java的SPI機(jī)制

1.SPI簡(jiǎn)述

SPI(Service Provider Interface),是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制。SPI通過加載ClassPath路徑下的META-INF/services文件夾下的所有文件,自動(dòng)加載文件里所制定的接口實(shí)現(xiàn)類。在Dubbo、JDBC(Class.forName("com.mysql.jdbc.Driver")讀取MySQL的jar包中的META-INF/services/com.mysql.jdbc.Driver文件)中都使用到了SPI機(jī)制。

不足:
ServiceLoader加載META-INF/services/*使用了延遲加載,但只能將實(shí)現(xiàn)類全部加載并實(shí)例化,然后通過遍歷全部獲取。

2.代碼示例:

2.1 Maven項(xiàng)目結(jié)構(gòu):
Maven項(xiàng)目結(jié)構(gòu).png
2.2 接口類SpiService.java:
package com.lance.spi.demo.iservice;

public interface SpiService {
    void execute();
}

2.3 實(shí)現(xiàn)類ComplexSpiServiceImpl.java:
package com.lance.spi.demo.service.impl;

import com.lance.spi.demo.iservice.SpiService;

public class ComplexSpiServiceImpl  implements SpiService {
    @Override
    public void execute() {
        System.out.println("ComplexSpiServiceImpl execute.");
    }
}
2.4 實(shí)現(xiàn)類SimpleSpiServiceImpl.java:
package com.lance.spi.demo.service.impl;

import com.lance.spi.demo.iservice.SpiService;
public class SimpleSpiServiceImpl implements SpiService {
    @Override
    public void execute() {
        System.out.println("SimpleSpiService execute.");
    }
}

2.5 com.lance.spi.demo.iservice.SpiService文本文件:
com.lance.spi.demo.service.impl.ComplexSpiServiceImpl
com.lance.spi.demo.service.impl.SimpleSpiServiceImpl
2.6 主類JavaSpiMain.java:
package com.lance.spi.demo.main;

import com.lance.spi.demo.iservice.SpiService;
import sun.misc.Service;

import java.util.Iterator;
import java.util.ServiceLoader;

public class JavaSpiMain {


    public static void main(String[] args) {


        System.out.println("----------- Service.providers --------------");

        Iterator<SpiService> providers = Service.providers(SpiService.class);


        while(providers.hasNext()) {
            SpiService spiService = providers.next();
            spiService.execute();
        }
        System.out.println("------------ ServiceLoader.load ----------------");


        ServiceLoader<SpiService> load = ServiceLoader.load(SpiService.class);
        Iterator<SpiService> iterator = load.iterator();
        while(iterator.hasNext()) {
            SpiService spiService = iterator.next();
            spiService.execute();
        }



    }
}

2.7 輸出結(jié)果:
----------- Service.providers --------------
ComplexSpiServiceImpl execute.
SimpleSpiService execute.
------------ ServiceLoader.load ----------------
ComplexSpiServiceImpl execute.
SimpleSpiService execute.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容