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(如有多个,换行添加不同

本文深入探讨了SPI(Service Provider Interface)的概念,从Java的SPI机制开始,分析了Spring如何在其自动装配中实现类似功能。接着,详细介绍了Dubbo的SPI机制,特别是ExtensionLoader的工作原理,包括获取扩展、自适应扩展的选择,并通过一个具体的例子解释了`injectExtension(T instance)`与Wrapper的区别。通过对MockProtocolWrapper的分析,展示了Dubbo如何在运行时动态生成Adaptive代理对象并进行注入。
最低0.47元/天 解锁文章
6608





