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.