超级详细的Dubbo SPI源码分析流程
2022-03-19 12:11:04 0 举报
本文件属于个人技术总结,未经本人允许不可以进行转载,发现必究
作者其他创作
大纲/内容
com.**.dubbo.filter.FilterClient#doInvoke4Filter
查看EXTENSION_LOADER是否存在Filter的拓展加载器,如果不存在,需要将该类的加载器放置到EXTENSION_LOADERS中
adaptive=org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactoryspi=org.apache.dubbo.common.extension.factory.SpiExtensionFactory
private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension();
org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository
org.apache.dubbo.common.extension.ExtensionLoader#cacheAdaptiveClass
存在包装类
getOrCreateHoldergetOrCreateHolder判断Filter的Holder是否存在
cachedClasses中获取Classes
org.apache.dubbo.common.extension.ExtensionLoader#getExtensionLoader
org.apache.dubbo.common.extension.ExtensionLoader#injectExtension
对defaultName初始化
SPI注解中的value值不为空,获取 SPI注解中的value值否则,获取配置文件中的name值
双重校验加锁单例模式
org.apache.dubbo.common.extension.ExtensionLoader#cacheActivateClass
参数name:dubboExceptionFilter
default=org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository
org.apache.dubbo.common.extension.factory.SpiExtensionFactory
Extension Instance 创建完成并返回
org.apache.dubbo.common.extension.ExtensionLoader#getOrCreateHolder
org.apache.dubbo.common.extension.ExtensionLoader#loadDirectory
Class类作为Key,name作为valu存储到cachedNames
AdaptiveInstance instance为空
createAdaptiveExtensionClass();org.apache.dubbo.common.extension.ExtensionLoader#createAdaptiveExtensionClass
读取不同路径下的配置文件
判定是否该类有包装类
injectExtension((T) getAdaptiveExtensionClass().newInstance())
org.apache.dubbo.common.extension.ExtensionLoader#saveInExtensionClass
com.**.manager.dubbo.filter.DubboExceptionFilter
injectExtension(instance)
返回Extension 的实例此处以DefaultExecutorRepository为例返回该类的对象
cachedDefaultName初始化:org.apache.dubbo.common.extension.ExtensionLoader#cacheDefaultExtensionName
org.apache.dubbo.common.extension.ExtensionLoader#getAdaptiveExtension
org.apache.dubbo.common.extension.ExtensionLoader#getExtensionClasses
查询cachedInstances 是否存在Filter的Holder
org.apache.dubbo.common.extension.ExtensionLoader#createExtension
@SPI(\"default\")Interface org.apache.dubbo.common.threadpool.manager.ExecutorRepository
cacheDefaultExtensionName()
包装类
org.apache.dubbo.common.extension.ExtensionLoader#loadClass
org.apache.dubbo.common.extension.ExtensionLoader#getExtension(java.lang.String)
在EXTENSION_INSTANCES 中获取Class对应的实例对象,如果实例对象不存在,则通过反射构造方法实例化类存储到EXTENSION_INSTANCES
org.apache.dubbo.common.extension.ExtensionLoader#ExtensionLoader
@SPI Interface org.apache.dubbo.rpc.Filter
loadExtensionClasses()
org.apache.dubbo.common.extension.ExtensionLoader#cacheName
org.apache.dubbo.common.extension.ExtensionLoader#getDefaultExtension
Adaptive修饰类或方法
org.apache.dubbo.common.extension.ExtensionFactory
ExtensionFactory初始化
@SPIInterfaceorg.apache.dubbo.common.extension.ExtensionFactory
org.apache.dubbo.common.extension.ExtensionLoader#loadExtensionClasses
返回编译好的Adaptive类
Holder,存在,则返回获取到Holder,不存在就创建一个新的Holder,用于后面的设置
初始化Instanceorg.apache.dubbo.common.extension.ExtensionLoader#initExtension
cachedInstances中未获取到Holder,Instance为空,所以需要创建Extend需要创建Extendsion Instance放到Holder中
org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactory
Dubbo IOC dubbo ioc是通过setter方法注入依赖,Dubbo首先通过反射获取到实例的所有方法,然后通过遍历方法列表,检查方法名中是否具有setter方法特征 若有:则通过ObjectFactory获取依赖对象,最后通过反射调用setter方法将依赖设置到目标对象中
getExtension可以参考下面真个流程的细节
getExtension(cachedDefaultName)
对配置文件内容进行加载和解析
org.apache.dubbo.common.extension.ExtensionLoader#loadResource
initExtension(instance)
返回 extensionLoader
ConsumerFilter=com.**trace.rpc.dubbo.filter.DubboConsumerFilterProviderFilter=com.**.trace.rpc.dubbo.filter.DubboProviderFilterdubboLogFilter=com.**.common.dubbo.DubboLogFilterdubboExceptionFilter=com.**.dubbo.filter.DubboExceptionFilter
Classes为空
org.apache.dubbo.config.bootstrap.DubboBootstrap
处理包装类
org.apache.dubbo.common.extension.ExtensionLoader#getAdaptiveExtensionClass
ExtensionLoader<Filter> loader = ExtensionLoader.getExtensionLoader(Filter.class);
Interface Listener
不为空
getExtensionClasses();org.apache.dubbo.common.extension.ExtensionLoader#getExtensionClasses
org.apache.dubbo.common.extension.ExtensionLoader#cacheWrapperClass
将name和Class类存储到extensionClasses
ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()
META-INF/dubbo/internal/:该目录用于存储 Dubbo 框架本身提供的 SPI 扩展META-INF/dubbo/:第三方提供的扩展META-INF/services/:JDK SPI 的配置文件目录
前面已经存在该函数调用
根据Key获取到Class类
如果Classes为空,说明未加载过,需要重新加载
org.apache.dubbo.common.extension.ExtensionLoader#ExtensionLoader(私有构造方法,初始化ExtensionFactory)
0 条评论
回复 删除
下一页