ExtensionLoader的原理
SPI
java中的SPI
SPI(Service Provider Interface)是java中一种服务发现机制,通过在classpath下的META-INF/services下指定一接口全路径名的文件中指定具体实现类(可配置多个),通过ServiceLoader进行动态可替换的服务方式调用。
测试类
package com.example.spi;
import java.util.ServiceLoader;
public class SpiMain {
public static void main(String[] args) {
ServiceLoader<Ilanguage> serviceLoader = ServiceLoader.load(Ilanguage.class);
for(Ilanguage service:serviceLoader){
service.call();
}
}
}
接口类及实现类
package com.example.spi;
public interface Ilanguage {
void call();
}
package com.example.spi;
//实现类之一,中文
public class IChineseLanguage implements Ilanguage {
@Override
public void call() {
System.out.println("Chinese call impl");
}
}
//实现类之一,英文
package com.example.spi;
public class IEnglishLanguage implements Ilanguage {
@Override
public void call() {
System.out.println("English call impl");
}
}
提供扩展配置文件倍SPI加载
接口名文件中指定实现类全路径名,比如com.example.spi.IChineseLanguage(如有多个,换行添加不同实现类全路径名)
此时通过serviceLoader会加载到所有配置的服务实现类并调用
Spring中的SPI
spring作为java中流行的应用框架之一,也有对于SPI的变体支持。这个