大致思路:

我们都知道spring中在用dubbo的时候主要靠@service和@reference注解,那么主要讲解这两个注解的原理

spring容器在加载的时候 我们需要扫描@service的类 ,往spring容器中放一个bean,还要创建一个dubbo的serviceBean

serviceBean有各种属性 比如version ,register等等

这个对象中有一个export方法 这个方法就是用来服务导出及服务注册

serviceBean和 bean对象 有一个关联 通过ref属性指向

一. @Enable注解有下面两个注解

1. @EnableDubboConfig

这个注解用来加载配置 @Import一个类DubboConfigConfigurationRegistrar 实现了一个 ImportBeanDefinitionRegistrar类 如果实现了这个类 那么spring在启动的时候就会执行这个类中的方法

这个方法主要是 往spring容器中添加bean

1) 处理properties文件

spring会读取这个文件 会放在enviroment对象里面  然后dubbo从这个对象中取就行了

2) 生成不同的配置对象

根据 dubbo.application.* 等属性  生成 ApplicationConfig对象

根据 dubbo.protocols.* 等属性 生成 ProtocolConfig对象

根据 dubbo.registers.*等属性 生成 RegistryConfig 对象

providerConfig,ConfigCenterConfig,ConsumerConfig等

这些对象会作为ServiceBean对象的属性

Single Multiple 这个两个类主要是描述配置前缀对应哪个类  比如 dubbo.application前缀对应ApplicationConfig.class

这两个类上面都有一个注解@EnableDubboConfigBingdings 对应 DubboConfigBingdingsRegistrar类

spring启动的时候会调用这个类的方法,这个方法会去哪这个注解里面的子注解 就能拿到那些前缀和类的关系

通过前缀到environment去拿那些配置项 如果是空的直接return 如果有了就生成beanNames,因为这块代码是复用的,所以是Names,如果type为single就返回只有一个值的集合

通过字符串截取操作得到beanNames  遍历这些beanNames,1. 往spring容器中注册bean 2. 给刚才生成的bean对象中的属性赋值

AutowiredBeanPostProcessor作用 所有的bean都会经过这个类 给bean中的@Autowired注解的属性赋值 注意:dubbo2.5版本每一个bean生成一个processor 实际所有bean走同一个processor即可 新版本dubbo解决了这个问题

目前一个bean会经过所有的processor 然后通过beanName判断来处理对应的bean 这点就是没必要的

经过DubboConfigBinder.bind方法猴 ApplicationConfig类的属性都有值  通过前缀获取enviroment中所有配置值 然后赋值给对应的属性

2. @EnableComponentScan

这个注解用来进行扫描配置的路径 并且来处理@Service @Reference注解

1) 处理@Service注解:

ServiceAnnotationBeanPostProcessor是一个bean工厂的处理类 不是 bean的后置处理类 与上面的AutowireBeanPostProcessor类不一样 它的作用是注册bean 被@Service注解标记的类

首先定义一个扫描器 会扫描某个类上面有没有@Service注解

会放在spring容器中registry

然后注册 serviceBean  先拿到注解 然后拿到服务类对应的service实现类的名字

去构造一个ServiceBean  然后拿@service上的属性值赋值给这个 ServiceBean 这里会忽略一些值 如果protocol 赋值的时候是一个字符串 比如 p1 所以不会将这个 字符串赋值到ServiceBean属性上 而是通过前面加载的配置类找到

bean对象 赋值到属性上

所以这些忽略的属性值 下面要单独配置 addPropertyReference 这个方法就是通过name找到对应的bean赋值到ServiceBean对应的属性中 这是spring中的一个方法

2) 处理@Reference注解

这个注解同@Autowired注解 所以我们也需要一个ReferenceBeanPostProcessor后置类处理所有带有@Refere注解的属性

doGetInjectedBean()  这个方法对应spring容器中postProcessPropertyValues 通过了解spring中的bean的生命周期就能明白这一点

传入一个bean 就会遍历这个类的所有field 找到带有@Reference注解的fields

InjectionMetadata表示注入点 一个bean中的可能会有多个注入点 这个是spring的一个接口 dubbo中有其对应的两个实现类 一个判断field上有没有@Reference注解 一个是个判读method上有没有@Reference注解

他们分别会放在两个不同的list中  然后遍历 找到注入点后 对当前注入点进行赋值

需要 注解上的属性 当前类 类名称 注入点类型 注入点元素

然后调用 doGetInjectedBean方法生成一个对象 这个方法先用ServiceBean的名字去当前spring容器中找有没有对应的ServiceBean 这个ServiceBean命名是 ServiceBean:org.apche.demo.DemoService

ServiceBeanNameBuider.build()来构建这个名字 如果有这个名字 就生成一个代理对象 这里为啥不返回ref对应的bean对象 但是这里是dubbo 只能给一个代理对象 这样dubbo里面的很多逻辑才能走到 这里并不是@Autowired注解

接下来又会用@Reference中的属性比如group version 生成一个bean 这里会缓存起来 这个key是@Reference及其属性值组成的字符串  value为 ReferenceBean

ReferenceBean表示我们引入的dubbo服务 这个类中有一个get方法用来产生代理对象

这里会判断referenceBean是否在spring容器中 如果没有就会将这个bean放到spring容器中 它是一个FactoryBean 为了支持@Autowired注解

构建映射关系,如果缓存中没有就返回代理对象 执行invoke方法

这里最重要的是有一个缓存 而且@Reference我们得到的一个消费者代理对象

最后注意ReferenceBeanPostProcessor的执行在AutowiredBeanPostProcessor前面

3. 下图就是整个@EnableDubbo注解的源码流程图,也是spring整合dubbo的核心逻辑:

Spring整合dubbo原理相关推荐

  1. Dubbo学习记录(八) -- Spring整合Dubbo中@Reference注解解析原理

    Spring整合Dubbo中@Reference注解解析原理 @Reference: 可以用在属性或者方法, 意味着需要引用某个Dubbo服务, 那么Dubbo整合Spring后, 我很好奇怎么把这个 ...

  2. spring整合dubbo和springboot整合dubbo,实现服务暴露区别

    spring整合dubbo的时候实现服务暴露是这么做的,在xml里配置 那么springboot整合dubbo的时候,是通过dubbo的@Service 注解实现的 之前我们是通过@Autowired ...

  3. spring整合dubbo实现简单分布式接口调用

    随着微服务,分布式的概念越来越火,越来越多的互联网公司开始尝试使用分布式进行项目开发,分布式开发的好处毋庸置疑,分工明确,团队协作高效,安全,解耦分离等,其中以springcloud为代表的新分布式微 ...

  4. Spring整合MyBatis原理之Mapper接口和xml文件的解析

    目录 1. 前言 2. 类 `SqlSessionFactoryBean` 2.1. 实现了 `FactoryBean` 接口的 `getObject()` 2.2. `buildSqlSession ...

  5. Mybatis 与Spring整合及原理

    Mybatis 与Spring原理分析 http://www.mybatis.org/spring/zh/index.html 这里我们以传统的Spring 为例,因为配置更直观,在Spring 中使 ...

  6. Spring 整合 Mybatis 原理

    目录 Mybatis的基本工作原理 分析需要解决的问题 Spring中Bean的产生过程 解决问题 解决方案 FactoryBean Import 总结 优化 Mybatis的基本工作原理 在 Myb ...

  7. spring整合mybatis 原理

    1,spring 整合mybatis依赖 sqlSessionFactoryBean和MapperFacetoryBean 两个接口 2,spring 通过sqlSessionFactoryBean ...

  8. spring整合mybatis原理

    1.MyBatis整合Spring实现 我们先来实现MyBatis和Spring的整合操作. 1.1什么事MyBatis? MyBatis 是一个可以自定义 SQL.存储过程和高级映射的持久层框架. ...

  9. spring整合dubbo服务消费和发现入门示例

    文章目录 准备 公共接口部分 服务提供 服务消费 准备 1.启动zookeeper 目录 其中interface包下是公共接口 测试预期结果: 订单服务web模块在A服务器,用户服务模块在B服务器,A ...

最新文章

  1. JAVA中重写equals()方法的同时要重写hashcode()方法
  2. 常见数据结构与算法:拆分数字(暴力递归,动态规划)
  3. Spring Boot 2.0 新特性和发展方向
  4. easyScholar——文献数据库插件
  5. AbstractFactoryPattern(23种设计模式之一)
  6. SQL算法中的变量使用占位符动态赋值
  7. 目录服务软件 AD和LDAP 的理解
  8. K8S_Google工作笔记0002---K8S集群架构组件
  9. linux磁盘阵列扩容,linux raid1扩容的方法
  10. 看高手都是运用的灵活自如,打算从今天开始学习他!
  11. linux 清空history以及记录原理
  12. 解决家庭版win10、win8没有远程桌面选项
  13. Android中复杂日历控件,CalenderView-一个优雅、高度自定义、性能高效的Android日历控件...
  14. 【工具】pt-online-schema-change
  15. 2021年中国上市公司发明授权数量及分布:发明授权数量连续5年增长,广东省位居全国第一[图]
  16. 2018/7/18 HDU 5294 Tricks Device 最短路建图+最小割 训练日记2
  17. VMware Workstation虚拟机无法获取IP地址的解决办法
  18. 使用opencv读取rtsp流的图片帧进行目标检测,并将处理好的图像推到rtsp服务器上
  19. Zookeeper之ZAB协议详解
  20. 用C#写差异文件备份工具

热门文章

  1. 知识付费系统微信提示用户信息获取失败
  2. RBA验厂辅导,RBA主要是电子行业的社会责任审核标准
  3. IPV4和IPV6的区别
  4. linux open: permission denied,Linux运行文件出现“Permission denied”解决办法
  5. python3exe_用cxfreeze打包Python3.3成exe文件
  6. 最强大脑第六期饶舜涵和倪梓强 他们的大脑是天生的么?
  7. hph IIS配置问题
  8. 图像对比度提高的两种方法
  9. ovs datapath
  10. C#Winform实现高效率导入和导出Excel文件