dubbo-SPI

SPI
1.ExtensionLoader.getExtensionLoader:创建指定类型的ExtensionLoader对象
1.new ExtensionLoader(type):创建指定类型的ExtensionLoader对象
->AdaptiveExtensionFactory objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension():初始化这个extensionLoader对象的objectFactory
objectFactory作用:扩展点依赖注入(injectExtension)时会通过objectFactory生成待注入的属性所需类型的自适应扩展点
2.把extensionLoader对象缓存到Map中:EXTENSION_LOADERS.putIfAbsent(type,extensionLoader);
2.ExtensionLoader.getExtension:创建指定类型静态扩展点的实例
createExtension
1.getExtensionClasses->loadExtensionClasses->loadDirectory(加载指定路径下的文件中配置的扩展点Class,保存到cachedClasses属性中)->loadResource->loadClass
1.cacheAdaptiveClass:把标注了@Adaptive注解的类赋值给cachedAdaptiveClass属性。
2.cacheWrapperClass:保存type类型的包装类到cachedWrapperClasses属性。type为Protocol时包装类为:QosProtocolWrapper/ProtocolListenerWrapper/ProtocolFilterWrapper
3.cacheActivateClass:保存标注了@Activate注解的类到cachedActivates属性。
4.saveInExtensionClass
2.clazz.newInstance
3.injectExtension
4.instance = wrapperClass.getConstructor(type).newInstance(instance);包装instance,例如生成DubboProtocol时经过包装后变为:QosProtocolWrapper(ProtocolListenerWrapper(ProtocolFilterWrapper(DubboProtocol))
3.ExtensionLoader.getAdaptiveExtension:创建指定类型自适应扩展点的实例
createAdaptiveExtension
1.getAdaptiveExtensionClass
1.getExtensionClasses->loadExtensionClasses->loadDirectory(加载指定路径下的文件中配置的扩展点Class,保存到cachedClasses属性中)->loadResource->loadClass
1.cacheAdaptiveClass:把标注了@Adaptive注解的类赋值给cachedAdaptiveClass属性。
2.cacheWrapperClass:保存type类型的包装类到cachedWrapperClasses属性。
1.type为Protocol时包装类为:QosProtocolWrapper/ProtocolListenerWrapper/ProtocolFilterWrapper
2.程序运行过程中,当调用到Protocol A d a p t i v e 的 @ A d a p t i v e 方 法 时 , 会 根 据 U R L ( 例 如 d u b b o : / / i p : p o r t ) 获 取 静 态 扩 展 点 ( D u b b o P r o t o c o l ) , 其 中 会 把 D u b b o P r o t o c o l 包 装 为 Q o s P r o t o c o l W r a p p e r ( P r o t o c o l L i s t e n e r W r a p p e r ( P r o t o c o l F i l t e r W r a p p e r ( D u b b o P r o t o c o l ) ) 3. c a c h e A c t i v a t e C l a s s : 保 存 标 注 了 @ A c t i v a t e 注 解 的 类 到 c a c h e d A c t i v a t e s 属 性 。 4. s a v e I n E x t e n s i o n C l a s s 2. c r e a t e A d a p t i v e E x t e n s i o n C l a s s : 为 标 注 了 @ A d a p t i v e 的 方 法 创 建 C l a s s 对 象 1. S t r i n g c o d e = n e w A d a p t i v e C l a s s C o d e G e n e r a t o r ( t y p e , c a c h e d D e f a u l t N a m e ) . g e n e r a t e ( ) ; 生 成 动 态 代 理 类 的 字 符 串 2. C l a s s L o a d e r c l a s s L o a d e r = f i n d C l a s s L o a d e r ( ) ; 3. C o m p i l e r c o m p i l e r = E x t e n s i o n L o a d e r . g e t E x t e n s i o n L o a d e r ( C o m p i l e r . c l a s s ) . g e t A d a p t i v e E x t e n s i o n ( ) ; C o m p i l e r 实 际 上 是 J a v a s s i s t C o m p i l e r 4. C l a s s c l a z z = c o m p i l e r . c o m p i l e ( c o d e , c l a s s L o a d e r ) ; 编 译 1 生 成 的 c o d e 代 码 为 C l a s s 对 象 2. C l a s s . n e w I n s t a n c e : 实 例 化 1 中 的 C l a s s 对 象 3. i n j e c t E x t e n s i o n 4. E x t e n s i o n L o a d e r . g e t A c t i v a t e E x t e n s i o n : 创 建 指 定 类 型 激 活 扩 展 点 的 实 例 5. E x t e n s i o n L o a d e r . i n j e c t E x t e n s i o n : 扩 展 点 依 赖 注 入 0. E x t e n s i o n L o a d e r . c r e a t e E x t e n s i o n / c r e a t e A d a p t i v e E x t e n s i o n 创 建 扩 展 点 时 会 调 用 i n j e c t E x t e n s i o n , 把 当 前 扩 展 点 实 例 需 要 通 过 s e t t e r 注 入 赋 值 的 属 性 赋 上 值 1. i n s t a n c e : 需 要 通 过 s e t t e r 注 入 属 性 的 对 象 , 其 本 身 也 是 一 个 扩 展 点 。 例 如 : R e g i s t r y P r o t o c o l , 需 要 通 过 s e t P r o t o c o l 注 入 P r o t o c o l 2. m e t h o d : R e g i s t r y P r o t o c o l 的 s e t P r o t o c o l 方 法 3. p t : P r o t o c o l . c l a s s 。 其 本 身 是 一 个 扩 展 点 。 4. p r o p e r t y : " P r o t o c o l " 5. o b j e c t : P r o t o c o l Adaptive的@Adaptive方法时,会根据URL(例如dubbo://ip:port)获取静态扩展点(DubboProtocol),其中会把DubboProtocol包装为QosProtocolWrapper(ProtocolListenerWrapper(ProtocolFilterWrapper(DubboProtocol)) 3.cacheActivateClass:保存标注了@Activate注解的类到cachedActivates属性。 4.saveInExtensionClass 2.createAdaptiveExtensionClass:为标注了@Adaptive的方法创建Class对象 1.String code = new AdaptiveClassCodeGenerator(type, cachedDefaultName).generate();生成动态代理类的字符串 2.ClassLoader classLoader = findClassLoader(); 3.Compiler compiler = ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension();Compiler实际上是JavassistCompiler 4.Class clazz = compiler.compile(code, classLoader);编译1生成的code代码为Class对象 2.Class.newInstance:实例化1中的Class对象 3.injectExtension 4.ExtensionLoader.getActivateExtension:创建指定类型激活扩展点的实例 5.ExtensionLoader.injectExtension:扩展点依赖注入 0.ExtensionLoader.createExtension/createAdaptiveExtension 创建扩展点时会调用injectExtension,把当前扩展点实例需要通过setter注入赋值的属性赋上值 1.instance:需要通过setter注入属性的对象,其本身也是一个扩展点。例如:RegistryProtocol,需要通过setProtocol注入Protocol 2.method:RegistryProtocol的setProtocol方法 3.pt:Protocol.class。其本身是一个扩展点。 4.property:"Protocol" 5.object:Protocol Adaptive@AdaptiveURL(dubbo://ip:port)(DubboProtocol)DubboProtocolQosProtocolWrapper(ProtocolListenerWrapper(ProtocolFilterWrapper(DubboProtocol))3.cacheActivateClass:@ActivatecachedActivates4.saveInExtensionClass2.createAdaptiveExtensionClass:@AdaptiveClass1.Stringcode=newAdaptiveClassCodeGenerator(type,cachedDefaultName).generate();2.ClassLoaderclassLoader=findClassLoader();3.Compilercompiler=ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension();CompilerJavassistCompiler4.Classclazz=compiler.compile(code,classLoader);1codeClass2.Class.newInstance:1Class3.injectExtension4.ExtensionLoader.getActivateExtension:5.ExtensionLoader.injectExtension:0.ExtensionLoader.createExtension/createAdaptiveExtensioninjectExtensionsetter1.instance:setterRegistryProtocol,setProtocolProtocol2.method:RegistryProtocolsetProtocol3.pt:Protocol.class4.property:"Protocol"5.object:ProtocolAdaptive。objectFactory.getExtension(pt, property)->AdaptiveExtensionFactory.getExtension:遍历SpiExtensionFactory/SpringExtensionFactory获取扩展点实例。
1.SpiExtensionFactory.getExtension->ExtensionLoader.getAdaptiveExtension(Protocol.class)
2.SpringExtensionFactory.getExtension->ApplicationContext.getBean:从spring容器中按name查找
6.method.invoke(instance, object);调用RegistryProtocol的setProtocol方法,把Protocol A d a p t i v e 对 象 注 入 到 R e g i s t r y P r o t o c o l 的 p r o t o c o l 属 性 7. 例 子 1. R e g i s t r y P r o t o c o l 的 p r o t o c o l 属 性 赋 值 : R e g i s t r y P r o t o c o l r e g i s t r y P r o t o c o l = E x t e n s i o n L o a d e r . g e t E x t e n s i o n L o a d e r ( P r o t o c o l . c l a s s ) . g e t E x t e n s i o n ( " r e g i s t r y " ) − > c r e a t e E x t e n s i o n − > i n j e c t E x t e n s i o n : 把 5 中 生 成 的 P r o t o c o l Adaptive对象注入到RegistryProtocol的protocol属性 7.例子 1.RegistryProtocol的protocol属性赋值:RegistryProtocol registryProtocol = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension("registry")->createExtension->injectExtension:把5中生成的Protocol AdaptiveRegistryProtocolprotocol7.1.RegistryProtocolprotocolRegistryProtocolregistryProtocol=ExtensionLoader.getExtensionLoader(Protocol.class).getExtension("registry")>createExtension>injectExtension:5ProtocolAdaptive对象赋值给protocol属性
2.RegistryProtocol的registryFactory属性赋值:RegistryProtocol registryProtocol = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(“registry”)->createExtension->injectExtension:把5中生成的RegistryFactory A d a p t i v e 对 象 赋 值 给 r e g i s t r y F a c t o r y 属 性 3. Z o o k e e p e r R e g i s t r y F a c t o r y 的 z o o k e e p e r T r a n s p o r t e r 属 性 赋 值 : Z o o k e e p e r R e g i s t r y F a c t o r y z o o k e e p e r R e g i s t r y F a c t o r y = E x t e n s i o n L o a d e r . g e t E x t e n s i o n L o a d e r ( R e g i s t r y F a c t o r y . c l a s s ) . g e t E x t e n s i o n ( " z o o k e e p e r " ) − > c r e a t e E x t e n s i o n − > i n j e c t E x t e n s i o n : 把 5 中 生 成 的 Z o o k e e p e r T r a n s p o r t e r Adaptive对象赋值给registryFactory属性 3.ZookeeperRegistryFactory的zookeeperTransporter属性赋值:ZookeeperRegistryFactory zookeeperRegistryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getExtension("zookeeper")->createExtension->injectExtension:把5中生成的ZookeeperTransporter AdaptiveregistryFactory3.ZookeeperRegistryFactoryzookeeperTransporterZookeeperRegistryFactoryzookeeperRegistryFactory=ExtensionLoader.getExtensionLoader(RegistryFactory.class).getExtension("zookeeper")>createExtension>injectExtension:5ZookeeperTransporterAdaptive对象赋值给zookeeperTransporter属性

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值