您的位置:首页 > 编程语言

dubbo 2.4.11源代码 - 扩展加载器

2017-03-01 14:30 253 查看
扩展加载器

             

             扩展接口的定义和特点


                 扩展接口中“方法声明的注解”@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

                 - ....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐