许多框架在编写时,都用到了SPI机制。那我们今天就来说说什么是SPI机制。
SPI机制:service provider interface,弱译:接口提供服务(白话翻译)。
网络语言:基于接口的编程+策略模式+配置文件”组合实现的动态加载机制
定义接口类(interface) +多个类对同一接口的实现(implements)+接口类和实现类进行一个配置( src/main/resources/ /META-INF/services/接口的类名)
接口名的类的内容是实现类的类名;这里所指类名都是全额限定名
将类打包后,引用该jar包,然后运行mian方法或者调用方就可以直接访问了。这是为什么呢?
下面就来说说:
其实是JDK中 自带的 java.util.ServiceLoader类起了作用。
这个类的代码为:
public final class ServiceLoader<S> implements Iterator<S>{
private static final String PREFIX="META-INF/services/;
private final Class<S> service;
private final ClassLoader loader;
private final AccessControlContext acc;
private LinkedHashMap<String,S> providers=new LinkedHashMap<String,S>();
private LazyIterator lookupIterator;
}
PREFIX代表了配置文件的地址
loader负责去装载类的字节码文件------将字节码文件交给service;service调用instance方法,通过无惨构造方法去实例化对象。
----将实例化好的对象放到providers中,以便调用。最后通过lookupIterator去迭代这个providers,方便来获取实例。
在这个过程中,是通过java反射实现的。所以在多线程是不安全的。