扩展加载器
扩展接口的定义和特点
扩展接口中“方法声明的注解”@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
- ....