Spring Cloud @RefreshScope 原理分析:扫描 Bean 定义

news2025/7/28 4:18:33

背景

最近读了一下 spring cloud 的 @RefreshScope 生效的源码,总结一下该注解的 refresh 类型的类实例化的过程。

关键技术点:

  1. 扫描过程中对 @RefreshScope 注解做了特殊处理,会额外注册两个BeanDefinition
  2. GenericScope 实现了 BeanDefinitionRegistryPostProcessor 接口,并对 refresh 的 BeanDefinition 添加了构造函数参数为自己,同时设置 beanClass 属性为 GenericScope.LockedScopedProxyFactoryBean.class,合成属性为 true
  3. GenericScope.LockedScopedProxyFactoryBean 类实现了 FactoryBeanBeanFactoryAwareMethodInterceptor 接口。

拆解三个部分:扫描 Bean 定义、代理类实例化、代理类方法调用,从这三个过程的源码,来理解为什么 @RefreshScope 标注的类的实能够动态应对环境变量的变化。

原始扫描 Bean 定义过程

ClassPathBeanDefinitionScanner 扫描时会对 @RefreshScope 注解的类的 BeanDefinition 定义信息作两个操作:
在这里插入图片描述
这个 applyScopedProxyMode 方法判断当前代理模式,如果
在这里插入图片描述
@RefreshScope 的这个属性是 ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS ,即针对这类注解的类在扫描时,会额外创建代理类的 BeanDefinition
在这里插入图片描述
主要是三个操作:

  1. 以原始的 BeanDefinition 新建一个代理类的 RootBeanDefinition,并且设置它的 decoratedDefinition 为原始对象,代理类的类型为 ScopedProxyFactoryBean
  2. 再注册一个以 "scopedTarget." + originalBeanName ,基于原始配置的目标定义,即真正实体的定义修改了;
  3. 最后再注册一个用 originalBeanName 的代理类的定义,就是偷梁换柱,完全代理了目标对象。
  4. 原始类定义的 autowireCandidate 为 false ,primary 也为 false ,那么就能保证实力获取时优先找到的候选对象是代理对象。

GenericScope 增强注册

GenericScope 实现了 BeanDefinitionRegistryPostProcessor 接口,而且它 Order 优先级较低,保证在 第一步的扫描之后执行如下操作:
在这里插入图片描述
这里对扫描阶段创建的代理类的 BeanDefinition 作了三个增强:

  1. 修改代理的 BeanDefinition 类型为自己的 LockedScopedProxyFactoryBean
  2. 为代理类的 BeanDefinition 添加一个构造函数的参数值为自己,因为 LockedScopedProxyFactoryBean 类的构造函数需要一个入参 Scope
  3. 设置合成属性为真。

启示录

@RefreshScope 是 spring cloud 的技术,它本质上扩展了 spring 框架的 Scope,跟其他单例、原型、请求类型、会话类型一样,是一种扩展 Scope ,巧妙应用了 ScopedProxyMode.TARGET_CLASS 和 AOP ,把 refresh 类型的对象托管起来,保证环境变量变更时,销毁旧的实例、获取最新的实例。

下一篇讲继续总结 ScopedProxyFactoryBean 这个类是如何创建出 @RefreshScope 注解的实例的,为什么能将一个委托类型偷梁换柱为一个 JdkDynamicAopProxy 代理类。

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

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

相关文章

医疗影像工具LEADTOOLS 入门教程: 从 PDF 中提取附件 - 控制台 C#

LEADTOOLS 是一个综合工具包的集合,用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和处理&#…

ARM平台搭建Python环境

ARM平台搭建Python环境写在最前常见问题1. 主机(Ubuntu)安装Python3.8.101.1 安装前的准备1.2 Ubuntu安装Python3.8.101.3 Ubuntu配置Python3.8.102. 宿主机(AMR)安装Python3.8.102.1 主机安装交叉编译工具2.2 交叉编译zlib库2.3 …

简析RE中python的exe文件

0x00. 前置学习 简单了解 python为什么要打包成exe文件?在日常生活中的应用是因为传输源文件以及源代码给他人是需要配置好一定的环境才能进行编译操作,而打包成exe文件就可以跟电脑软件一样打开就可以运行也可以分享给他人。 而对于ctf比赛来说&…

(三十三)大白话MySQL运行时多个事务同时执行是什么场景?

到目前为止,我们已经给大家深入讲解了MySQL的buffer pool机制、redo log机制和undo log机制,相信大家现在对我们平时执行一些增删改语句的实现原理,都有了一定较为深入的理解了! 因为平时我们执行增删改的时候,无非就…

Python|Leetcode刷题日寄Part04

Python|Leetcode刷题日寄Part0401:环形链表02:跳跃游戏03:括号生成04:二分查找05:打家劫舍06:搜索旋转排序数组07:Z字形变换08:买卖股票的最佳时机Ⅱ09:最后一个单词的长…

国产蓝牙耳机300左右哪个牌子的好?三百左右蓝牙耳机推荐

现在的蓝牙耳机样式越来越五花八门,各种性能也越来越好。特别是国产蓝牙耳机,近几年的发展十分快速。那么,三百左右哪个牌子的国产蓝牙耳机好?接下来,我来给大家推荐几款三百左右的蓝牙耳机,一起来看看吧。…

Java加密算法:base64,MD5加密,对称加密,非对称加密

目录 Java:密码算法 1、base64加密方式 2、jdk原生api实现MD5 3、使用codec依赖实现MD5加密 4、SHA加密 5、MAC算法加密 6、对称加密 7、非对称加密 Java:密码算法 1、base64加密方式 public class demo {//设置编码格式private static final S…

搜索引擎的6个技巧

今天看了一期seo优化的视频,其中就有这么一篇关于百度搜索的几个小技巧,这里整理出来,分享给大家。不是标题党,真的99%的人都不知道这个6个小技巧。 搜索引擎一般都会有一些高级的搜索技巧,掌握这些技巧之后就可以过滤…

spring的启动过程(二) :springMvc的启动过程

在上一篇文章中,我们详解了spring的启动过程,这一篇介绍spring mvc的启动过程,那么spring和spring mvc有什么联系呢。 1.Spring和SpringMVC是父子容器关系。2.Spring整体框架的核心思想是容器,用来管理bean的生命周期,…

CAN总线开发一本全(3) - 微控制器集成的FlexCAN外设

CAN总线开发一本全(3) - 微控制器集成的FlexCAN外设 苏勇,2023年2月 文章目录CAN总线开发一本全(3) - 微控制器集成的FlexCAN外设引言硬件外设模块系统概要总线接口单元 - 寄存器清单数据结构 - 消息缓冲区MB初始化过…

taobao.top.oaid.merge( OAID订单合并 )

¥开放平台免费API必须用户授权 基于OAID(收件人ID, Open Addressee ID)做订单合并,确保相同收件人信息的订单合并到相同组。 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请…

win10环境下安装java开发环境安装java

一:环境介绍 安装系统版本:win10 java版本:java SE 17 二:下载Java安装包 官网下载Java安装包:Java Downloads | Oracle 中国 选择需要的Java版本进行下载,如果没有要选择的版本,可以选择最新…

称重传感器差分输入信号隔离转换直流放大变送器0-±10mV/0-±20mV转0-10V/4-20mA

主要特性DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输入端和输出…

(二十九)大白话MySQL直接强行把redo log写入磁盘?

上一讲我们给大家说了一下redo log block这个概念,大家现在都知道平时我们执行完增删改之后,要写入磁盘的redo log,其实应该是先进入到redo log block这个数据结构里去的,然后再进入到磁盘文件里,如下图所示。 那么今天…

三、锁相关知识

文章目录锁的分类可重入锁、不可重入锁乐观锁、悲观锁公平锁、非公平锁互斥锁、共享锁深入synchronized类锁、对象锁synchronized的优化synchronized实现原理synchronized的锁升级重量锁底层ObjectMonitor深入ReentrantLockReentrantLock和synchronized的区别AQS概述加锁流程源…

Flink中遇到的问题

目录 1、提交flink 批处理任务时遇到的问题 2、flink定时任务,mysql连接超时问题 3、yarn 增加并行任务数量配置 4、flink checkpoint 恢复失败 5、flink程序在hadoop集群跑了一段时间莫名挂掉 1、提交flink 批处理任务时遇到的问题 问题描述: …

超详细树状数组讲解(+例题:动态求连续区间和)

树状数组的作用:快速的对数列的一段范围求和快速的修改数列的某一个数为什么要使用树状数组:大家从作用中看到快速求和的时候可能会想到为什么不使用前缀和只需要预处理一下就可以在O(1)的时间复杂度下实行对于数列的一段范围的和但是我们可以得到当我们…

记一次服务器入侵事件的应急响应

0x01 事件背景 8月某日,客户官网被黑,需在特定时间内完成整改。为避免客户业务受到影响,实验室相关人员第一时间展开本次攻击事件的应急处理。 0x02 事件分析 网站源码被篡改,攻击者一定获取到了权限,那么接下来的思…

Linux进程1 - 进程的相关概念

目录 1.进程的概念 2.并行和并发 3.PCB(进程控制块) 4.进程状态 1.进程的概念 程序:二进制文件,占用的磁盘空间进程:启动的程序所有的数据都在内存中需要占用更多的系统资源cpu,物理内存 2.并行和并发 并发----在…

Spring事物和事务的传播机制

事务的定义:将一组操作封装到一个执行单元,要么全部成功,要么全部失败。 一、Spring中事务的实现 Spring中事务的操作分为两类: 1.编程式事务(手动写代码操作事务) 2.声明式事务(利用注解自动…