SPI ,全称为 Service Provider Interface,是一种服务发现机制

一、java使用

1.创建interface接口com.xxx.IService
2.创建两个实现类AImpl和BImpl,实现IService接口
3.工程resources路径下,META-INF下创建services文件夹,以IService的路径命名文件(文件名com.xxx.IService)

resources
    |
    --META-INF
        |
        --services
            |
            --com.xxx.IService

文件中写明实现类全路径(com.xxx.impl.AImpl和com.xxx.impl.BImpl)

则通过以下方式能获取IService实现

ServiceLoader<IService> serviceLoader = ServiceLoader.load(IService.class);
//iterator获取了IService的全部实现
Iterator<IService> iterator = serviceLoader.iterator();
while (iterator.hasNext()){
    iterator.next().doSomething();
}

将接口(IService)替换成抽象类、普通类依然奏效

二、spring使用

resources
    |
    --META-INF
        |
        --spring.factories

在spring.factories文件中注明依赖关系

com.xxx.IService=com.xxx.impl.AImpl,\
com.xxx.impl.BImpl

获取方式:

@Test
public void testBootSpi(){
    List<IService> serviceList = SpringFactoriesLoader.loadFactories(IService.class,
            ClassUtils.getDefaultClassLoader());
    for (IService service : serviceList) {
        service.doSomething();
    }
}
03-05 15:03