Dubbo#编译动态扩展类

这篇排版有问题 后面修改....****

以ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();为例

-->ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()
  -->new ExtensionLoader<T>(Protocol.class)
     -->this.type = Protocol.class
     -->objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()
    -->new ExtensionLoader<T>(ExtensionFactory.class)
        -->this.type = ExtensionFactory.class
        -->objectFactory  = null
        -->getAdaptiveExtension()
       -->instance = createAdaptiveExtension
           -->AdaptiveExtensionFactory.class = getAdaptiveExtensionClass
          -->getExtensionClasses
             -->Map<String, Class<?>> classes = loadExtensionClasses        //加载扩展类
                -->loadDirectory    //以此加载当个默认目录下的
                com.alibaba.dubbo.common.extension.ExtensionFactory文件中的扩展类
               -->loadResource
                  -->loadClass
                文件中AdaptiveExtensionFactory类有@Adaptive注解
                cachedAdaptiveClass = AdaptiveExtensionFactory.class
                然后加载SpiExtensionFactory,SpringExtensionFactory, 并放入extensionClasses(Map)
                cachedNames.put(SpiExtensionFactory.class, spi) 
                cachedNames.put(SpringExtensionFactory.class, spring)
            -->cachedClasses.set(classes )  
                此时cachedClasses中有了SpiExtensionFactory.class和SpringExtensionFactory.class
           -->由于AdaptiveExtensionFactory.class给cachedAdaptiveClass赋值了,这个返回cachedAdaptiveClass
           -->injectExtension(AdaptiveExtensionFactory.class.newInstance)  
        **//IOC  通过set方法给属性赋值, 这里调用了构造方法,将cachedClasses中的值添加到factories中**

        **//这里就是AdaptiveExtensionFactory中factories值得由来**
           -->cachedAdaptiveInstance.set(instance)  //将AdaptiveExtensionFactory对象保存起来
     -->EXTENSION_LOADERS.put(ExtensionFactory.class, 扩展器) 
         **//注意,这里将ExtensionFactory的扩展器保存在EXTENSION_LOADERS中了,这是个static变量**
    //以上都是ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()的步骤
     -->getAdaptiveExtension
    -->createAdaptiveExtension
       -->Protocol$Adaptive = getAdaptiveExtensionClass
          -->getExtensionClasses
         这里步骤与加载ExtensionFactory一样,加载com.alibaba.dubbo.rpc.Protocol下的扩展类
        由于该文件下没有@Adaptive修饰的类,执行createAdaptiveExtensionClass方法生成动态类
           -->createAdaptiveExtensionClass
          -->createAdaptiveExtensionClassCode //创建动态类代码
          -->AdaptiveComplier = ExtensionLoader.getExtensionLoader(Compiler.class)
                            .getAdaptiveExtension();
             -->new ExtensionLoader<T>(Compiler.class)
            -->this.type = Compiler.class;
            -->objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class)
                            .getAdaptiveExtension());
               -->直接从EXTENSION_LOADERS中获取ExtensionFactory的扩展器
               -->getAdaptiveExtension
                  -->createAdaptiveExtension
                 -->getExtensionClasses
                    //Compiler文件中AdaptiveCompiler类被@Adaptive修饰,直接返回
                    -->AdaptiveCompiler.compile
                       -->AbstractCompiler.compile
                    **//先使用Class.forName去加载该class文件**
                    **//如果没有调用JavassistCompiler.doCompile  使用javassist去编译(cls.toClass)的到**
                **// 到这里从获取到扩展类到编译得到Class文件就完成了**
             -->EXTENSION_LOADERS.put(Compiler.class, 扩展器)
    -->cachedAdaptiveInstance.set(Protocol$Adaptive);
  -->EXTENSION_LOADERS.put(Protocol.class, 扩展器)

下面是大致得过程图

B1A6EACB171544EBA84D76E1DCB9027F?method=download&shareKey=148af1b95308699414a3078503682bd2

转载于:https://www.cnblogs.com/qiaozhuangshi/p/11007051.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值