记录下学习阅读---------dubbo-spi源码

dubbo spi

Dubbo spi目的:获取一个实现类对象

途径:ExtensionLoader.getExtension(String name)|
实现途径:
getExtensionLoader(Class<T> type)  就是为该接口new一个ExtensionLoader,然后缓存起来
getAdaptiveExtension() 获取一个扩展装饰类型的对象,如果没有@Adaptive注解,就会动态创建一个装饰类,例如Protocol&Adative对象
getExtension(String name) 获取一个对象
1. 源码getExtensionLoader阅读:
----------------------------ExtensionLoader.getExtensionLoader(Class<T> type)
ExtensionLoader.getExtensionLoader(Container.class)
	-->this.type = type;
	-->objectFactory= ExtensionLoader.getExtensionLoader(ExtensionFactory.class)
		-->ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension())
    	-->this.type = type;
			-->objectFactory=null

以上代码完成了2个属性的赋值

  1. 每个ExtensionLoader都包含了2个值type和 objectfactor

    Class<?> type // 初始化得到的接口名字
    ExtensionFactory objectFactory//初始AdaptiveExtensionFactory[SpiExtensionFactory,Spring]
    
  2. new 一个ExtensionLoader,存储在ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS

2.阅读getAdaptiveExtension()
adaptive注解在类和方法上的区别:
1.注解在类上:代表人工编码,即实现一个装饰类,例如 ExtesionFactory
2.注解在方法上:代表自动生成和编译一个动态的adaptive类,例如Protocol&Adaptive
--------------------getAdaptiveExtension()
	-->getAdaptiveExtension()  
  	-->createAdaptiveExtension()
  		-->getAdaptiveExtensionClass()
  			-->getExtensionClasses()//缓存cachedClasses赋值
					--> loadExtensionClasses()
						-->loadFile
			  -->	createAdaptiveExtensionClass()//自动生成和编译一个动态adptive类,是代理类
          -->ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension();
				   	-->compiler.compile(code, classLoader);
      -->injectExtension()//作用 进入ioc反转 控制,实现动态织入

关于 loadFile的一些细节
目的:通过把配置文件META-INF/dubbo/internal/xxx的 内容,缓存在缓存变量里面

cacheAdaptiveClass://如果当前class含有adative注解就赋值,例如ExtesionFactory,而Protocol就没
cacheWrapperClass//只有当这个class无adative注解,并且构造函数包含目标接口type,例如protocolFilterWrap
cacheActivateClass://剩下的类包含activate注解
cacheName://剩下的类就存在这里

3.阅读getExtension()

---------------------------getExtension(String name)
  -->createExtension(String name)
    --> getExtensionClasses()
    -->  injectExtension(T instance) //dubbo的IOC反转控制,就是 从Spring和spi提取对象赋值
  		--> objectFactory.getExtension(pt, property)
        -->SpiExtensionFactory.getExtensionLoader(type,name)
  				-->ExtensionLoader.getExtensionLoader(type)
  				-->loader.getAdaptiveExtension();
							-->loadFile
	 -->instance = injectExtension((T)wrapperClass.getConstructor(type).newInstance(instance));//Aop
					
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值