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
- ....
扩展接口的定义和特点
扩展接口中“方法声明的注解”@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
- ....
相关文章推荐
- dubbo 2.4.11源代码 - Registry关于Provider注册与Consumer订阅类图(草图)
- dubbo 2.4.11源代码 - 其他
- dubbo 2.4.11源代码 - Provider接受请求类图(草图)
- dubbo 2.4.11源代码 - provider 和 provider 的配置(URL对象)
- dubbo 2.4.11源代码 - Consumer发送请求类图(草图)
- 编译时出现:请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。
- ext-2.0扩展多选下拉框(代码及演示)
- 用Equalizer扩展Ogre应用的示例代码
- ext-2.0扩展多选下拉框(代码及演示)
- MicrosoftReportingServicesinAction:用自定义代码扩展Microsoft2000ReportingServic…
- 编译时出现:请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。
- 如何将自己的代码自动添加版权信息的及其扩展
- 我得到了一些代码, 里边有太多的 #ifdef。 我不想使用预处理器把所有的 #include 和 #ifdef 都扩展开, 有什么办法只保留一种条件的代码呢?
- ext-2.0扩展多选下拉框(代码及演示)
- ext-2.0扩展树形下拉框(代码及演示)
- 创建可重用、可扩展和可伸缩的 PHP 代码
- 给ACAD增加个命令,修改外部DWG文件,给所有LINE加扩展数据的完整的ARX代码...
- ext-2.0扩展树形下拉框(代码及演示)
- 用代码创建扩展数据类型EDT
- Microsoft Reporting Services in Action:用自定义代码扩展 Microsoft SQL Server 2000 Reporting Services