Spring与Dubbo整合原理与源码分析

news2024/9/9 4:38:01

在这里插入图片描述
@EnableDubbo注解中有两个注解
@EnableDubboConfig是用来解析配置文件的
@DubboComponentScan是用来扫描@Service和@Refrence的

1.Dubbo中propertie⽂件解析以及处理原理

在这里插入图片描述
我们看到引入了DubboConfigConfigurationRegistrar,一看就知道干嘛了,老套路
在这里插入图片描述
我们看下DubboConfigConfiguration.Single
在这里插入图片描述

在这里插入图片描述

org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar#registerDubboConfigBeans

在这里插入图片描述
注册我们注解上ApplicationConfig、ProtocolConfig、ConfigCenterBean这些类的BeanDefinition

接下为每个AbstracetConfig bean注册一个DubboConfigBindingBeanPostProcessor的Bean后置处理器

org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar#registerDubboConfigBindingBeanPostProcessor

在这里插入图片描述
可以看到把我们的beanName作为构造参数传入

我们看下 DubboConfigBindingBeanPostProcessor
在这里插入图片描述
在afterPropertiesSet中初始化我们dubboConfigBinder,属性赋值用
在这里插入图片描述
在这里插入图片描述
每个XxConfig对应一个BeanPostProcessor,所以每个DubboConfigBindingBeanPostProcessor只处理对应的beanName
进行属性赋值

这样我们的XXXConfig 就已经又了配置文件中的值

在这里插入图片描述
在这里插入图片描述
注册了两个后置处理器,分别处理我们这两个注解

org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor

2.Dubbo中@Service注解解析以及处理原理

老朋友了,和mybatis套路一样
在这里插入图片描述

org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor#registerServiceBeans

在这里插入图片描述

在这里插入图片描述
首先和mybatis一样 也是定义了DubboClassPathBeanDefinitionScanner,设置useDefaultFilters = false,这样就不会扫描Component在这里插入图片描述

在这里插入图片描述
然后把@Service 加入includeFilters,这样就可以扫描标记@Service注解的bean了

在这里插入图片描述
我们分别看下
1.

org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents
org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#isCandidateComponent(org.springframework.core.type.classreading.MetadataReader)

在这里插入图片描述
@Service 注解就会背扫描成BeanDefinition
但是此时他只是一个普通的springBean,并不能表示dubbo服务,所以dubbo还会为每一个springBean构建一个ServiceBean 表示 dubbo 提供者服务
2.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置一些属性信息,例如ref指向springBean、interface指向属于哪个接口

在这里插入图片描述

ServiceBean继承了ServiceConfig,ServiceConfig封装了我们提供者的一些属性
在这里插入图片描述

然后给我们的@ServiceBean 起一个bean名称,接下来注册bean定义

bean名称就是ServiceBean常量+接口+组+版本等

3.Dubbo中@Reference注解解析以及处理原理

@Reference 可以标注在字段上用来属性注入

我们知道@Autowired是通过

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

注入的,他有一个父类

InstantiationAwareBeanPostProcessorAdapter

在这里插入图片描述

我们上面说到 注册了

org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor

在这里插入图片描述
可以看到我们注册的bean 也实现了InstantiationAwareBeanPostProcessorAdapter
在这里插入图片描述

Spring在对Bean进⾏依赖注⼊时会调⽤AnnotationInjectedBeanPostProcessor的 postProcessPropertyValues()⽅法来给某个Bean按照ReferenceAnnotationBeanPostProcessor的逻 辑进⾏依赖注⼊。
在这里插入图片描述
首先去找属性值,返回InjectionMetadata
在这里插入图片描述
我们这里返回的是AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata

接下来调用InjectionMetadata的inject方法
在这里插入图片描述
在这里插入图片描述
AnnotatedMethodElement重写inject方法
逻辑就是从spring 容器中拿出来,然后反射放进去

我们重点看下怎么从spring拿的

org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor#getInjectedObject

在这里插入图片描述
其余部分是缓存,重点看下org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor#doGetInjectedBean

在这里插入图片描述
六个方法,我们分别看下
1.第一步就是拿@Service的bean名称
2.第二步就是拿@Refrence的bean名称
在这里插入图片描述
3.第三步构建ReferenceBean对象

org.apache.dubbo.config.spring.beans.factory.annotation.AnnotatedInterfaceConfigBeanBuilder#build
 @Override
    protected ReferenceBean doBuild() {
        return new ReferenceBean<Object>();
    }

在这里插入图片描述
可以看到我们手动new了一个,并且继承了ReferenceConfig,实现了FactoryBean
在这里插入图片描述
都是从@Reference注解中拿属性并设置到方法上

4.注册ReferenceBean到spring容器中
在这里插入图片描述

如果容器包含@Service的beanName,那么就把ServiceBean的ref 起个别名 就是我们ReferenceBean的名字,这样注入的时候就注入本地bean了
注册ReferenceBean到spring容器中
此处这么做就⽀持了可以通过@Autowired注解也可以使⽤服务了,ReferenceBean是 ⼀个FactoryBean
5.就是个缓存,过
6.获取要注入的对象
在这里插入图片描述

如果本地不存在ServiceBean,那么就调用get方法
在这里插入图片描述
在这里插入图片描述
这部分逻辑服务引入文章讲解

如果本地存在ServiceBean
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE4 】制作螺旋桨飞机

一、素材资源链接&#xff1a;https://pan.baidu.com/s/1xPVYYw05WQ6FABq_ZxFifg提取码&#xff1a;ivv8二、课程视频链接https://www.bilibili.com/video/BV1Bb411h7qw/?spm_id_from333.337.search-card.all.click&vd_source36a3e35639c44bb339f59760641390a8三、最终效果…

CVE-2022-42889 Apache Commons Text 漏洞

0x00 前言 所幸遇到&#xff0c;就简单看看&#xff0c;其中没有啥比较难的地方&#xff0c;仅做记录。10月13日的漏洞。 cve链接可以看下面这个&#xff1a; https://cve.mitre.org/cgi-bin/cvename.cgi?nameCVE-2022-42889 git地址&#xff1a; https://github.com/apache…

AcWing蓝桥杯辅导课:第二讲 二分与前缀和

AcWing 789. 数的范围 思路&#xff1a; 二分模板一共有两个&#xff0c;分别适用于不同情况。 算法思路&#xff1a;假设目标值在闭区间[l, r]中&#xff0c; 每次将区间长度缩小一半&#xff0c;当l r时&#xff0c;我们就找到了目标值。 版本1 当我们将区间[l, r]划分成[…

基于蚂蚁优化算法的柔性车间调度研究(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

21_FreeRTOS内存管理

目录 FreeRTOS内存管理 FreeRTOS内存管理算法 内存管理相关API函数介绍 实验源码 FreeRTOS内存管理 在使用FreeRTOS创建任务、队列、信号量等对象的时,一般都提供了两种方法: 动态方法创建 自动地从 FreeRTOS 管理的内存堆中申请创建对象所需的内存&#xff0c;并且在对…

AcWing算法提高课-3.1.1热浪

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 题目传送门点这里 题目描述 德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪&#xff01;&#xff01;&#xff01; 他们的德克萨斯长角牛吃起来不错&#xff0c;可是它们并不是很擅长生产富…

【博学谷学习记录】超强总结,用心分享丨人工智能 特征工程 特征变换 分箱学习总结

目录概念分箱的作用等频分箱等距分箱*卡方分箱公式例子概念 特征构造的过程中&#xff0c;对特征做分箱处理时必不可少的过程分箱就是将连续变量离散化&#xff0c;合并成较少的状态 分箱的作用 离散特征的增加和减少都很容易&#xff0c;易于模型的快速迭代&#xff1b;稀疏…

IB选课避坑指南,选课不踩雷

众所周知&#xff0c;IBDP课程颇具挑战性&#xff0c;对于学习者的英语写作、意志力、自律性要求都比较严格。 如果你高中阶段想学习IBDP课程&#xff0c;那么在学习之前一定要搞清楚怎么选课再做决定&#xff01;年轻的IB人&#xff0c;你们准备好了吗&#xff1f; 很多同学在…

Java程序设计-JSP程序设计-SSM校园二手交易系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把二手物品交易管理与现在网络相结合&#xff0c;利用java技术建设二手物品交易系统&#xff0c;实现二手物品交易的信息化。则对于进一步提高二手物品交易管理发展&#xff0c;丰富二手物品交易管理经验能起到不少的促进作用…

明星的孩子也在做的感统训练,真的有用吗?

林志颖曾经在社交网站晒过带他儿子“模拟过山车”的视频。孩子大脑前庭受到适当的刺激&#xff0c;可以有效地锻炼前庭平衡感。 除此之外&#xff0c;还能看见地上的感统教具&#xff1a;过河石、平衡桥&#xff0c;看来明星老爸在陪孩子做感统游戏的日常一点也不含糊。 其实在…

Flutter Scrollable 中ViewPort滚动原理

关于Flutter Sliver组件内容可以参考下面这位博主博客&#xff0c;写的已经非常好了&#xff0c;这里就不再赘述。 38、Flutter之 可滚动组件简介_flutter 可滑动_风雨「83」的博客-CSDN博客 通过阅读上面的博客&#xff0c;我们已经知道了Scrollable和Viewport基础概念&#…

【手把手一起学习】(七) Altium Designer 20常用PCB设计规则

1 常用PCB设计规则 PCB规则设计是PCB设计中至关重要的环节&#xff0c;它约束了电气要求、布线方式、器件摆放位置等&#xff0c;为后续的手动布局、布线提供依据。完善的PCB规则设计&#xff0c;可以减少设计中的错误&#xff0c;提高PCB设计效率。 1.1 PCB设计规则管理器 …

Aspect-Based Sentiment Analysis Model with Bi-Guide Attention Network 论文阅读笔记

一、作者 Xie Jun, Wang Yuzhu, Chen Bo, Zhang Zehua, and Liu Qin College of Information and Computer, Taiyuan University of Technology, Jinzhong, Shanxi 二、背景 在应用于方面情感分析的深度神经网络中&#xff0c;序列型神经网络能捕获句子的上下文语义信息&am…

血脂高的全身表现,这几种吃法改善

血脂变化总是不知不觉的&#xff0c;很多人没有明显的不适&#xff0c;但是血脂已经慢慢升高&#xff0c;随之而来的就是各种心血管疾病。好在血脂高还有一些外在表现&#xff0c;出现这些变化&#xff0c;多加注意。经常头晕头痛、睡不好、健忘、手脚发麻、午后犯困、夜晚清醒…

TencentOS 3.1安装MySQL 8.0.32

到官网下载安装包&#xff1a;https://dev.mysql.com/downloads/mysql/ 使用如下命令解包。 tar xf mysql-8.0.32-1.el8.x86_64.rpm-bundle.tar 使用rpm -qa |grep mysql 和rpm -qa |grep mariadb检查是否安装过mysql 如果有&#xff0c;使用下命令移除&#xff1a; rpm -e …

6 集成学习及Python实现

1 主要思想 集成学习: 三个臭裨将, 顶个诸葛亮 Bagging: 数据随机重抽样, 并行构建分类器, 投票&#xff1b;Boosting: 关注被错分的样本, 串行构建分类器, 加权投票。 2 理论 AdaBoost (Adaptive Boosting)示意图1 错误率: εEN\varepsilon \frac{E}{N}εNE​ 其中NNN为…

【halcon】dev_set_part / set_part

前言&#xff1a; dev_set_part / set_part 其实功能是一样的。下面就set_part 进行讲解。 背景 我在写程序的时候需要一个诉求&#xff0c;我找了很多瑕疵&#xff0c;每个瑕疵都有一个位置&#xff0c;这些位置在一个数据的列表&#xff0c;我希望在列表点到瑕疵位置的时…

mysql数据库常用字符串函数

文章目录一、字符串函数详解二、文档下载地址一、字符串函数详解 1、ascii(str) 返回值为字符串str 的最左字符的数值,即取得最左字符的ascii码。假如str为空字符串&#xff0c;则返回值为 0 。假如str 为null&#xff0c;则返回值为 null。 2、bin(n) 返回值为n的二进制值的…

了解Maven的作用

专门用于管理和构建Java的工具&#xff0c;主要功能有如下: 1.提供一套标准化的项目结构 在不同的Java ide上面创建项目结构&#xff0c;比如说IDEA和eclipse这些ide上创建Java项目都有所不同 但是使用Maven创建项目可以使得项目结构标准化&#xff0c;如下图所示就是使用IDE…

LeetCode 700. 二叉搜索树中的搜索

LeetCode 700. 二叉搜索树中的搜索 难度&#xff1a;easy\color{Green}{easy}easy 难度&#xff1a;middle\color{orange}{middle}middle 难度&#xff1a;hard\color{red}{hard}hard 题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 rootrootroot 和一个整数值…