SPI是什么
SPI ,全称为 Service Provider Interface,是一种服务发现机制,动态的为某个接口寻找服务实现。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
代码示例
定义接口
package com.test;
public interface DataProcessor {
void process();
}
定义实现类
package com.abc;
import com.test.DataProcessor;
public class DefaultDataProcessor implements DataProcessor {
public void process() {
System.out.println("this is default processor!");
}
}
配制实现类
resources/META-INF/services/com.test.DataProcessor
com.abc.DefaultDataProcessor
测试自动装配实例
import org.junit.jupiter.api.Test;
import sun.misc.Service;
import java.util.Iterator;
public class SpiTest {
@Test
void testSpi() {
Iterator<DataProcessor> providers = Service.providers(DataProcessor.class);
while(providers.hasNext()) {
DataProcessor processor = providers.next();
System.out.println(processor.getClass().getClassLoader());
processor.process();
}
}
}
测试过程中出现警告信息
警告: sun.misc.Service是内部专用 API, 可能会在未来发行版中删除 Iterator<DataProcessor> providers = Service.providers(DataProcessor.class);
修改build.gradle
tasks.withType(JavaCompile) {
// '-verbose',
options.compilerArgs += [ '-bootclasspath', System.properties['java.home']+'/lib/rt.jar']
}