dubbo相关SPI

SPI :全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想启动运行时动态的给它添加实现,你只需要添加一个实现,而后,把新加的实现,描述给JDK知道就行啦(通过改一个配置文本文件即可)

com.alibaba.dubbo.container.Main 是服务启动的主类,对象中定义了一个ExtensionLoader<Container>对象,会获取/META-INF/dubbo/internal/com.alibaba.dubbo.container.Container配置文件中的Container并start。

参考:ExtensionLoader是dubbo内部的SPI实现,很多对象都是由这个类生成,比较常见的Filter等,并且支持自定义Filter。所以在dubbo中,需要扩展的功能,一般在接口上会加上@SPI注解。

@SPI("netty")
public interface Transporter {...}

@SPI
public interface Filter {...}

@SPI("javassist")
public interface ProxyFactory {...}

@SPI("spring")
public interface Container {...}

 代码中,常常使用ExtensionLoader.getExtensionLoader(Transporter.class).getAdaptiveExtension()来获取需要的对象,通过getExtensionClasses()来获取对应的Class,调用过程中,loadExtensionClasses()->loadFile()方法就是获取接口实例对应Class的,并且会读取到接口上默认的实现类。通过反射加载Class。

Class<?> clazz = Class.forName(line, true, classLoader);

 

猜你喜欢

转载自1181731633.iteye.com/blog/2398057