Dubbo的SPI原理
2021-02-28 20:09:41 1 举报
Dubbo的SPI原理
作者其他创作
大纲/内容
new ExtensionLoader(type)
获取名称为YY的实现了XX接口的class对象
从SpiExtensionFactory中
ExtensionLoader.getExtensionLoader(XX.class)
wrapperClass.getConstructor(type).newInstance(instance)
ExtensionLoader.loadExtensionClasses()
ExtensionLoader.cacheAdaptiveClass()
放入Map中
把XX.class类型的ExtensionLoader添加到ConcurrentMap中
ExtensionLoader.createExtension(\"YY\")
ExtensionLoader.loadDirectory()
否
ExtensionLoader.cacheDefaultExtensionName()
cachedAdaptiveClass != null
缓存添加了@Adaptive注解的类
ExtensionLoader.getOrCreateHolder
AdaptiveExtensionFactory.createAdaptiveExtensionClass()
ExtensionLoader.injectExtension(instance)
加载SPI文件,放入Map中
方法上存在@Adaptive注解才进行代理,寻找URL1. 如果当前方法中有URl类型的参数,那么url就是该参数值2. 如果当前方法中没有URL类型的参数,但是当前方法中有某个类型中的get方法返回了URl类型,那么就调用那个get方法得到一个url对象
ExtensionLoader.getExtensionClasses().get(name)
判断是否有缓存了的@Adaptive注解标记的类
ExtensionLoader.cacheWrapperClass()
AdaptiveClassCodeGenerator.generateMethodContent(Method method)
创建动态Class的代理类
返回的是实现了ExtensionFactory接口,同时添加了@Adaptive注解的的实现类的实例,即AdaptiveExtensionFactory类的实例对象
ExtensionLoader.createAdaptiveExtension()
AdaptiveExtensionFactory.createAdaptiveExtension()
把class对象的实例对象添加到ConcurrentMap中
是
ExtensionLoader.getAdaptiveExtension()
给Instance对象属性注入值
AdaptiveClassCodeGenerator.generateMethod()
ExtensionLoader.loadClass()
从META-INF/services/、META-INF/dubbo/、META-INF/services/internal/三个目录下从加载SPI文件
接口默认的扩展类,即XX.class接口的@SPI注解的值
ExtensionLoader.loadResource()
ExtensionLoader.getExtension(\"YY\")
AdaptiveExtensionFactory.getAdaptiveExtensionClass()
从Spring容器中取
生成方法的内容
objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())
0 条评论
下一页