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源码解析(二)相关推荐

  1. Dubbo第三讲:Dubbo的可扩展机制SPI源码解析

    本文是Dubbo第三讲:Dubbo的可扩展机制SPI源码解析 文章目录 1.Dubbo SPI机制 1.1.Dubbo具有良好拓展性的原因 1.2.Dubbo SPI和Java SPI的区别? 1.3 ...

  2. Dubbo的可扩展机制SPI源码解析

    内容概要: Dubbo SPI案例演示 Dubbo SPI主流程源码解析 Dubbo中的依赖注入源码解析 Dubbo中的AOP实现源码解析 Dubbo中的Adaptive机制源码解析 文章目录 一.D ...

  3. JVM类加载机制(ClassLoader)源码解析

    http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...

  4. Spring事件机制Event源码解析(未完待续)

    Spring事件机制Event源码解析(未完待续) 监听器: ApplicationEvent事件 ApplicationListener监听器(观察者) ApplicationEventMultic ...

  5. 【深度学习模型】智云视图中文车牌识别源码解析(二)

    [深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...

  6. Java SPI 源码解析及 demo 讲解

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Java实现QQ登录和微博登录个人原创+1博客:点击前往,查看更多 作者:JlDang 来源:https://s ...

  7. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  8. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

    女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...

  9. Mobx 源码解析 二(autorun)

    前言 我们在Mobx 源码解析 一(observable)已经知道了observable 做的事情了, 但是我们的还是没有讲解明白在我们的Demo中,我们在Button 的Click 事件中只是对ba ...

最新文章

  1. 张红忠:智慧化时代,如何通吃5G模组、AIoT?
  2. 计算机上没有找到服务was,win10系统搭建网站提示计算机“.”上没有找到wAs服务的步骤介绍...
  3. maven超级pom内容
  4. 苦大仇深--写给想做产品的朋友们(二)
  5. HarmonyOS之常用布局AdaptiveBoxLayout的使用
  6. 【转】Android开发之数据库SQL
  7. 《高效程序员的45个习惯》-之一
  8. 计算机应用技木就业前京,计算机专业毕业的研究生在京就业情况及启示.doc
  9. lamda 对比两个list_正式支持多线程!Redis 6.0与老版性能对比评测
  10. Python Itsdangerous
  11. mongodb adminmongo 使用过程中的一些小问题记录
  12. BITED数学建模七日谈之一:参加全国大学生数学建模比赛前你需要积累哪些
  13. 2. 创建多网站和商店(Creating Multiple Websites and Stores)
  14. 快应用开发教程【01】--环境与调试
  15. 联想服务器pxe安装系统,使用CloudBoot裸机部署Lenovo ThinkSystem服务器
  16. 计算机房采用c02采灭火,[灭火器使用.doc
  17. 阿里巴巴代码规范 学习总结
  18. C语言之一个有趣的关机程序
  19. 番茄todo服务器维护,番茄ToDo:克服“拖延症”必备高效神器!
  20. 新王诞生!ACP世界大赛中国区总决赛超燃收官!

热门文章

  1. 武汉疫情 - 新型冠状病毒信息整理
  2. wps如何在目录里面打省略号_在wps中怎么让文档目录的省略号对齐 - 卡饭网
  3. server 2008 r2 怎么打开任务管理?
  4. Exiv2 With XMP for Android
  5. react 实现图片上传功能
  6. linux http连接超时时间设置,Linux 下 HTTP连接超时
  7. 支持历史阅读记录的PDF阅读工具
  8. 题目 1224: 整除的尾数
  9. Hyper-v安装虚拟机问题(持续更新)
  10. VMware vSphere(三)update management