@RefreshScope热更新原理

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: @RefreshScope实现配置热更新,核心在于@Scope("refresh")与动态代理。该注解使Bean纳入自定义缓存,配置变更时清空缓存,触发Spring重新创建Bean实例,结合Environment更新,实现@Value属性的动态刷新。本质是缓存失效+Bean重建机制。

在前面学习Nacos的章节中,为了实现配置的热更新我们采取了两种方式,其一就是借助于注解:@RefreshScope,那么这个注解是如何做到标识即生效的?我们尝试一起分析一下。
1.了解@RefreshScope本身
点击进去此注解,可以发现其本质也是一个组合注解,如下 对于Spring注解有过研究的读者,对于这几个元注解一定不陌生,简短的篇幅了解一下:
@Target({ ElementType.TYPE, ElementType.METHOD })
目标的作用范围
ElementType.TYPE:能修饰类、接口或枚举类型
ElementType.FIELD:能修饰成员变量
ElementType.METHOD:能修饰方法
ElementType.PARAMETER:能修饰参数
ElementType.CONSTRUCTOR:能修饰构造器
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType.ANNOTATION_TYPE:能修饰注解
ElementType.PACKAGE:能修饰包
@Retention(RetentionPolicy.RUNTIME)
保留的生命周期
SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;即保留在.java文件中
CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;即保留在.class文件中
RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后仍然存在;即保留在内存中的字节码文件中,一旦jvm加载就会更新,生命周期最长
@Scope("refresh")
实现配置、实例热加载的关键核心,默认了ScopedProxyMode.TARGET_CLASS; 属性,此属性的功能就是在创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象。集成了Spring框架之后,实际就是调用Spring的装配机制重新装配属性。
所以截止目前我们可以了解到:@RefreshScope注解本身是一个组合注解,其实现配置热更新的关键是依赖@Scope("refresh")。我们进一步来看看@RefreshScope到底做了什么?
2.@RefreshScope做了什么
@RefreshScope主要就是基于@Scope注解的作用域代理的基础上进行扩展实现的,加了@RefreshScope注解的类,在被Bean工厂创建后会加入自己的refresh scope 这个Bean缓存中,后续会优先从Bean缓存中获取,当配置中心发生了变更,会把变更的配置更新到spring容器的Environment中,并且同时bean缓存就会被清空,从而就会从bean工厂中创建bean实例了,而这次创建bean实例的时候就会继续经历这个bean的生命周期,使得@Value属性值能够从Environment中获取到最新的属性值,这样整个过程就达到了动态刷新配置的效果。
所以截止目前我们可以了解到下述大致流程:

3.@RefreshScope怎么做到的
基于上面我们知道,@Scope基于缓存失效,实现配置的热更新,我们继续看看它是如何做到的:

4.总结
对于@RefreshScope注解实现配置热更新的流程,实际是借助于缓存失效+Spring重新创建配置Bean解决,知道这个思路之后,读者们可以借助本章节2,或3做流程性、原理性了解。

相关文章
|
Serverless Go
手把手教你用Go语言画出正弦图像 模拟画图不再难!
手把手教你用Go语言画出正弦图像 模拟画图不再难!
557 0
|
5月前
|
存储 缓存 负载均衡
Nacos注册中心
本文详细介绍Nacos的安装部署、服务注册与发现、分级模型、负载均衡策略、权重控制、环境隔离及实例类型等核心功能,涵盖从入门到实战的全流程,助力掌握Nacos在微服务架构中的应用,实现高效服务治理与配置管理。
|
5月前
|
Java Nacos Maven
Eureka服务注册与发现
本章介绍Eureka服务注册中心的搭建与使用,完成user-service和order-service的服务注册,实现多实例部署。虽Eureka已被SpringCloud逐步淘汰,但其核心思想仍具参考价值,后续将用Nacos替代并深入探讨。
|
5月前
|
JSON 缓存 前端开发
什么是跨域
CORS(跨域资源共享)是W3C标准,允许浏览器向跨源服务器发起XMLHttpRequest请求,突破AJAX同源限制。浏览器自动处理通信过程,关键在于服务器需实现CORS接口。请求分为简单和非简单两类,后者需先发送OPTIONS预检。相比仅支持GET的JSONP,CORS功能更强大,兼容现代浏览器。
|
5月前
|
存储 安全 Java
认证源码分析与自定义后端认证逻辑
本文深入分析Spring Security认证流程,从UsernamePasswordAuthenticationFilter到AuthenticationManager、ProviderManager,最终到UserDetailsService的实现原理,揭示了自定义数据库认证的关键点:通过实现UserDetailsService接口并重写loadUserByUsername方法,返回包含用户信息和权限的UserDetails对象,并在配置类中注册该服务,即可完成自定义认证。全过程涵盖过滤器链、认证管理、权限封装及安全上下文存储机制。
|
5月前
|
负载均衡 算法 架构师
Ribbon负载均衡
本节深入讲解Ribbon实现客户端负载均衡的原理,解析@LoadBalanced注解的作用机制,剖析其通过拦截器、服务选取、URL重构实现负载均衡的全流程,并介绍自定义策略与饥饿加载优化方法,帮助读者全面掌握Ribbon核心知识。(238字)
|
5月前
|
自然语言处理 搜索推荐 Java
ES分布式搜索引擎入门
本课程学习Elasticsearch核心技能:掌握倒排索引原理,理解IK分词器及其词典扩展,熟练使用Java Client实现文档增删改查、批量导入及Term查询、全文检索、布尔查询等操作,并实现排序、分页与高亮功能。
|
5月前
|
Java 数据库 Sentinel
服务保护、分布式事务
本课程系统讲解微服务保护与分布式事务控制,涵盖雪崩问题、熔断降级、限流隔离等核心机制,基于Sentinel实现服务防护,并结合Seata完成分布式事务管理,掌握AT、XA等模式原理与应用。
|
文字识别 Java C++
Tesseract-OCR的简单使用与训练
Tesseract,一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Document Imaging(MODI)相比,我们可以不断的训练的库,使图像转换文本的能力不断增强;如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。
6580 0
|
大数据 数据管理 Docker
【Datahub系列教程】Datahub入门必学——DatahubCLI之Docker命令详解
【Datahub系列教程】Datahub入门必学——DatahubCLI之Docker命令详解
1609 0