@RefreshScope热更新原理

简介: 本文深入解析Spring Cloud中@RefreshScope注解实现配置热更新的原理。通过分析其组合注解特性,重点探讨@Scope("refresh")如何借助缓存机制与动态代理,在配置变更时触发Bean重建,结合Nacos实现配置自动刷新。

在前面学习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做流程性、原理性了解。

相关文章
|
7天前
|
数据采集 人工智能 监控
3分钟阿里云部署OpenClaw:解锁199+OpenClawSkills指南及ClawHub生态详解
2026年,开源Agent框架OpenClaw(原Clawdbot)凭借“自然语言驱动+模块化技能扩展”的核心优势,成为AI工具领域的现象级产品。其真正的强大之处,在于ClawHub技能市场中9000+款多样化Skills(技能插件)——这些“超级外挂”让OpenClaw从基础对话工具,升级为能执行文件管理、办公自动化、数据抓取、代码开发等复杂任务的全能助手。
455 2
|
2月前
|
JSON 测试技术 API
智能体搭建实战:如何把一个“会聊天的模型”做成“能跑工作流的系统”
本文揭秘智能体落地核心:告别“对话型”幻觉,聚焦“任务跑完”能力。六步工作流方法论——明确定义智能体三层架构,结构化输入与OutputSpec,构建Planner-Executor-Checker三段式链路,全程可存档、可复现,并为工具调用配备断言/重试/降级机制,最终沉淀为可扩展模板。稳定智能体的关键不在模型多强,而在工作流多确定。
|
2月前
|
Ubuntu Linux Anolis
docker/脚本/ISO镜像安装FreeSWITCH 1.10.12 图形化界面
本文详解FreeSWITCH三种部署方式:脚本安装(推荐生产环境)、系统镜像(开箱即用)、容器化(适用于测试)。支持AlmaLinux、Rocky Linux、国产麒麟等系统,涵盖硬件要求、安装步骤与安全建议,助力高效搭建企业通信平台。
|
3月前
|
存储 安全 小程序
认识OAuth2.0
OAuth2.0是一种开放授权标准,允许第三方应用在用户授权下安全访问资源,无需获取用户账号密码。它通过令牌(token)机制实现权限控制,广泛用于第三方登录、服务间资源共享等场景,支持授权码、简化、密码和客户端四种模式,兼顾安全性与灵活性。
认识OAuth2.0
|
3月前
|
存储 Java 关系型数据库
微服务概述
本文对比单体与微服务架构,阐述微服务通过服务拆分、独立部署、技术自治等特性,提升系统可维护性和扩展性,同时分析其优缺点及实现方案,助力构建高效分布式系统。
|
3月前
|
Java 测试技术 Linux
生产环境发布管理
本文介绍大型团队中基于自动化部署平台(Jenkins+K8S)的多环境发布流程,涵盖DEV、TEST、PRE、PROD各环境职责及CI/CD实践,结合Git分支管理、容器化部署与Skywalking日志追踪,实现高效发布与故障排查。
生产环境发布管理
|
Java 微服务 Spring
手把手教你实现@RefreshScope注解
【10月更文挑战第16天】 在Spring Cloud中,@RefreshScope注解被广泛用于动态刷新配置。当我们修改了配置文件中的值,并且希望这些更改在不重启应用的情况下立即生效时,这个注解就显得尤为重要。本文将带你一步步实现一个简单的@RefreshScope功能。
984 5
|
6月前
|
人工智能 IDE 开发工具
AI 编程,一键生成完整工程代码(企业级),开启零代码时代
飞算JavaAI是一款IDE插件,能将文字需求一键生成企业级完整工程代码,大幅提升开发效率。支持模块拆分、代码分层、数据库脚本生成,并可自定义代码风格与架构,适配团队规范。实现“零代码”开发与功能扩展,让开发者专注核心逻辑,告别重复编码。
|
资源调度 监控 前端开发
第七章(原理篇) 微前端技术之依赖管理与版本控制
第七章(原理篇) 微前端技术之依赖管理与版本控制
698 0
|
设计模式 开发框架 Java
分清 PO、VO、DAO、BO、DTO、POJO 含义
分清 PO、VO、DAO、BO、DTO、POJO 含义
1337 1