dubbo的可扩展机制SPI源码解析(二)
1、基本流程
2、AOP
3、IOC
4、AdaptiveExtension
5、ActivateExtension
getExtension(name)
getAdaptiveExtension(URL)
getAdaptiveExtension(URL,扩展点名称,group名称)
dubbo spi的使用:
需要设置的地方:
1)resource文件夹增加接口全路径名称的文件
2)接口类增加@SPI注解。
3)被代理的对象增加@Adaptive注解
配置好spi后执行的时候,是根据配置文件的key找到一个代理对象(此代理对象是根据配置的实现类的实例实现的,被代理的方法实现逻辑是,根据com.alibaba.dubbo.common.URL参数,拿到文件key,根据key找)
ExtensionLoader -- 扩展点加载器
1、type ---- 接口
2、objectFactory ----> 实现类的对象 ---- Spring容器(type)
方法
1、getExtension(name)----
2、createExtension(name) ----> 创建对象
1、name--->实现类的全路径名字
加载文件,遍历扫描文件内容,找到实现类的名字,放到map中。
扫描到的wrapper类名字都放到一个set中,供依赖注入后使用生成wrapper类实例
2、实例化(newInstance)-------carFilter
3、依赖注入
是通过set方法来设置属性的。
找到类的方法和参数,根据属性和方法找到对象,然后通过反射设置属性值(method.invoke(instance,object))
依赖注入后,会根据上一步的接口实例生成wrapper类的实例(传入了instance)。如果有多个wrapper的话,会把上一次生成的wrapper类实例当成一个实例传入,然后生成一个新的wrapper类实例,就像套娃一样。
4、AOP
5、return instance
3、loadExtensionClasses() -- return Map
1 三者的关系
SpiExtensionFactory
要使用这个来获取对象,必须在接口上使用@SPI注解。
获取的过程:先找到加载器,loader.getAdaptiveExtension()获取接口的Adaptive类(是一个代理对象)。
解决方法上必须使用@Adaptive注解,才能默认生成代理类。而且需要被代理的方法也必须有个com.alibaba.dubbo.common.URL(dubbo服务提供者的url)参数
如果接口方法没有指定Adaptive类,dubbo会默认生成一个
ExtensionLoader的代码:
//生成java类的代码
String code = this.createAdaptiveExtensionClassCode();
ClassLoader classLoader = findClassLoader();
Compiler compiler = (Compiler)getExtensionLoader(Compiler.class).getAdaptiveExtension();
//编译成class类
return compiler.compile(code, classLoader);
SpinrgExtensionFactory
是从ApplicationContext(Spring容器)中先根据名称去拿对象实例,如果没有找到再根据type去拿。
AdaptiveExtensionFactory:用来判断是适用spi的factory还是spring的factory。
具体再适用的时候,如果接口上制定了@SPI的注解,那就只能适用SpiExtensionFactory,否则,只要从一个factory中生成了对象实例就返回。
group 只是一个表示,不仅仅有PROVIDER和CONSUMER,可以随便定义
@Activate(group={PROVIDER,CONSUMER})
服务端和消费端都可以使用
@Activate(group=CommonConstants.PROVIDER)
只能服务端使用
@Activate(group=CommonConstants.PROVIDER,value="condition_param")
服务端使用,而且必须满足value配合的条件时才可使用
dubbo的可扩展机制SPI源码解析(二)相关推荐
- Dubbo第三讲:Dubbo的可扩展机制SPI源码解析
本文是Dubbo第三讲:Dubbo的可扩展机制SPI源码解析 文章目录 1.Dubbo SPI机制 1.1.Dubbo具有良好拓展性的原因 1.2.Dubbo SPI和Java SPI的区别? 1.3 ...
- Dubbo的可扩展机制SPI源码解析
内容概要: Dubbo SPI案例演示 Dubbo SPI主流程源码解析 Dubbo中的依赖注入源码解析 Dubbo中的AOP实现源码解析 Dubbo中的Adaptive机制源码解析 文章目录 一.D ...
- JVM类加载机制(ClassLoader)源码解析
http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...
- Spring事件机制Event源码解析(未完待续)
Spring事件机制Event源码解析(未完待续) 监听器: ApplicationEvent事件 ApplicationListener监听器(观察者) ApplicationEventMultic ...
- 【深度学习模型】智云视图中文车牌识别源码解析(二)
[深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...
- Java SPI 源码解析及 demo 讲解
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Java实现QQ登录和微博登录个人原创+1博客:点击前往,查看更多 作者:JlDang 来源:https://s ...
- erlang下lists模块sort(排序)方法源码解析(二)
上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...
- Kubernetes学习笔记之Calico CNI Plugin源码解析(二)
女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...
- Mobx 源码解析 二(autorun)
前言 我们在Mobx 源码解析 一(observable)已经知道了observable 做的事情了, 但是我们的还是没有讲解明白在我们的Demo中,我们在Button 的Click 事件中只是对ba ...
最新文章
- 张红忠:智慧化时代,如何通吃5G模组、AIoT?
- 计算机上没有找到服务was,win10系统搭建网站提示计算机“.”上没有找到wAs服务的步骤介绍...
- maven超级pom内容
- 苦大仇深--写给想做产品的朋友们(二)
- HarmonyOS之常用布局AdaptiveBoxLayout的使用
- 【转】Android开发之数据库SQL
- 《高效程序员的45个习惯》-之一
- 计算机应用技木就业前京,计算机专业毕业的研究生在京就业情况及启示.doc
- lamda 对比两个list_正式支持多线程!Redis 6.0与老版性能对比评测
- Python Itsdangerous
- mongodb adminmongo 使用过程中的一些小问题记录
- BITED数学建模七日谈之一:参加全国大学生数学建模比赛前你需要积累哪些
- 2. 创建多网站和商店(Creating Multiple Websites and Stores)
- 快应用开发教程【01】--环境与调试
- 联想服务器pxe安装系统,使用CloudBoot裸机部署Lenovo ThinkSystem服务器
- 计算机房采用c02采灭火,[灭火器使用.doc
- 阿里巴巴代码规范 学习总结
- C语言之一个有趣的关机程序
- 番茄todo服务器维护,番茄ToDo:克服“拖延症”必备高效神器!
- 新王诞生!ACP世界大赛中国区总决赛超燃收官!