乐趣区

关于java:什么是spi

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();
    }
}
退出移动版