dubbo 2.4.11源代码 - 扩展加载器


扩展加载器
             
             扩展接口的定义和特点

                 扩展接口中“方法声明的注解”@Adaptive({Constants.PROXY_KEY})决定了XxxAdpative自适应类中方法调用url.getParameter(Constants.PROXY_KEY,"javassist")获取参数时,使用的键名 Constants.PROXY_KEY
                 扩展接口中“类声明的注解”@SPI("javassist")决定了XxxAdpative自适应类中方法调用url.getParameter(Constants.PROXY_KEY,"javassist")获取不到参数时,使用的默认值javassist
             
            扩展加载器的应用功能
                 通过扩展加载器获取“自适应扩展”,    如 ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
                 通过扩展加载器获取“指定扩展”,    如 ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(extName);
             
             获取自适应扩展的机制(即:getAdaptiveExtension())
                 识别扩展接口的的注解 @SPI 获取默认值 cachedDefaultName
                 在类路径下依次搜寻 META-INF/dubbo/internal/cn.java.extensions.MyExtension、 META-INF/dubbo/cn.java.extensions.MyExtension、META-INF/services/cn.java.extensions.MyExtension文件做如下处理
                 {
                     读取文件中的每一行,“=”左侧作为模块名,右侧作为类名
                     “加载扩展类A”,如果类有声明注解 @Adaptive,那么这个类作为“自适应类”(一个扩展只能有一个“自适应类”) cachedAdaptiveClass=
                     尝试获取“加载扩展类A”的以扩展接口作为参数的构造函数,如果存在这个构造函数,那么记录此类为包裹类cachedWrapperClasses(如 :ProtocolFilterWrapper、ProtocolListenerWrapper)
                     包括扩展中的模块名和类型信息,保存进 extensionClasses.put(n, clazz);    cachedClasses.set(extensionClasses);
                 }
                 如果 cachedAdaptiveClass 为null,那么反射接口的信息,生成 Xxx$Adpative 类并进行编译,返回Adpative实例
                 反射Adpative实例的方法,识别setXXX的方法,注入依赖
                 返回Adpative实例
                 
             获取指定扩展的机制(即:getExtension())
                 识别扩展接口的的注解 @SPI 获取默认值 cachedDefaultName
                 在类路径下依次搜寻 META-INF/dubbo/internal/cn.java.extensions.MyExtension、 META-INF/dubbo/cn.java.extensions.MyExtension、META-INF/services/cn.java.extensions.MyExtension文件做如下处理
                 {
                     读取文件中的每一行,“=”左侧作为模块名,右侧作为类名
                     “加载扩展类A”,如果类有声明注解 @Adaptive,那么这个类作为“自适应类”(一个扩展只能有一个“自适应类”) cachedAdaptiveClass=
                     尝试获取“加载扩展类A”的以扩展接口作为参数的构造函数,如果存在这个构造函数,那么记录此类为包裹类cachedWrapperClasses(如 :ProtocolFilterWrapper、ProtocolListenerWrapper)
                     包括扩展中的模块名和类型信息,保存进 extensionClasses.put(n, clazz);    cachedClasses.set(extensionClasses);
                 }
                 反射extension实例的方法,识别setXXX的方法,进行注入依赖
                 如果此扩展存在包裹类,那么迭代包裹对象列表{
                     创建“包裹对象”(如ProtocolFilterWrapper、ProtocolListenerWrapper),对 extension实例进行包裹
                     反射“包裹对象”的方法,识别setXXX的方法,注入依赖
                 }
                 返回“包裹对象或者扩展对象”
             
             Protocol扩展
                 - Protocol$Adpative 如果没有定义并配置,会根据接口信息动态生成自适应类,本类的作用的是动态识别配置参数调用调用实际扩展
                 - RegistryProtocol
                 - DubboProtocol
                 - ThriftProtocol
                 - RmiProtocol
                 - MemcachedProtocol
                 - RedisProtocol
                 - ....


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值