Spring整合dubbo原理
大致思路:
我们都知道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原理相关推荐
- Dubbo学习记录(八) -- Spring整合Dubbo中@Reference注解解析原理
Spring整合Dubbo中@Reference注解解析原理 @Reference: 可以用在属性或者方法, 意味着需要引用某个Dubbo服务, 那么Dubbo整合Spring后, 我很好奇怎么把这个 ...
- spring整合dubbo和springboot整合dubbo,实现服务暴露区别
spring整合dubbo的时候实现服务暴露是这么做的,在xml里配置 那么springboot整合dubbo的时候,是通过dubbo的@Service 注解实现的 之前我们是通过@Autowired ...
- spring整合dubbo实现简单分布式接口调用
随着微服务,分布式的概念越来越火,越来越多的互联网公司开始尝试使用分布式进行项目开发,分布式开发的好处毋庸置疑,分工明确,团队协作高效,安全,解耦分离等,其中以springcloud为代表的新分布式微 ...
- Spring整合MyBatis原理之Mapper接口和xml文件的解析
目录 1. 前言 2. 类 `SqlSessionFactoryBean` 2.1. 实现了 `FactoryBean` 接口的 `getObject()` 2.2. `buildSqlSession ...
- Mybatis 与Spring整合及原理
Mybatis 与Spring原理分析 http://www.mybatis.org/spring/zh/index.html 这里我们以传统的Spring 为例,因为配置更直观,在Spring 中使 ...
- Spring 整合 Mybatis 原理
目录 Mybatis的基本工作原理 分析需要解决的问题 Spring中Bean的产生过程 解决问题 解决方案 FactoryBean Import 总结 优化 Mybatis的基本工作原理 在 Myb ...
- spring整合mybatis 原理
1,spring 整合mybatis依赖 sqlSessionFactoryBean和MapperFacetoryBean 两个接口 2,spring 通过sqlSessionFactoryBean ...
- spring整合mybatis原理
1.MyBatis整合Spring实现 我们先来实现MyBatis和Spring的整合操作. 1.1什么事MyBatis? MyBatis 是一个可以自定义 SQL.存储过程和高级映射的持久层框架. ...
- spring整合dubbo服务消费和发现入门示例
文章目录 准备 公共接口部分 服务提供 服务消费 准备 1.启动zookeeper 目录 其中interface包下是公共接口 测试预期结果: 订单服务web模块在A服务器,用户服务模块在B服务器,A ...
最新文章
- JAVA中重写equals()方法的同时要重写hashcode()方法
- 常见数据结构与算法:拆分数字(暴力递归,动态规划)
- Spring Boot 2.0 新特性和发展方向
- easyScholar——文献数据库插件
- AbstractFactoryPattern(23种设计模式之一)
- SQL算法中的变量使用占位符动态赋值
- 目录服务软件 AD和LDAP 的理解
- K8S_Google工作笔记0002---K8S集群架构组件
- linux磁盘阵列扩容,linux raid1扩容的方法
- 看高手都是运用的灵活自如,打算从今天开始学习他!
- linux 清空history以及记录原理
- 解决家庭版win10、win8没有远程桌面选项
- Android中复杂日历控件,CalenderView-一个优雅、高度自定义、性能高效的Android日历控件...
- 【工具】pt-online-schema-change
- 2021年中国上市公司发明授权数量及分布:发明授权数量连续5年增长,广东省位居全国第一[图]
- 2018/7/18 HDU 5294 Tricks Device 最短路建图+最小割 训练日记2
- VMware Workstation虚拟机无法获取IP地址的解决办法
- 使用opencv读取rtsp流的图片帧进行目标检测,并将处理好的图像推到rtsp服务器上
- Zookeeper之ZAB协议详解
- 用C#写差异文件备份工具
热门文章
- 知识付费系统微信提示用户信息获取失败
- RBA验厂辅导,RBA主要是电子行业的社会责任审核标准
- IPV4和IPV6的区别
- linux open: permission denied,Linux运行文件出现“Permission denied”解决办法
- python3exe_用cxfreeze打包Python3.3成exe文件
- 最强大脑第六期饶舜涵和倪梓强 他们的大脑是天生的么?
- hph IIS配置问题
- 图像对比度提高的两种方法
- ovs datapath
- C#Winform实现高效率导入和导出Excel文件