当前位置: 首页 > news >正文

Nacos-12--扩展:@RefreshScope和@ConfigurationProperties实现热更新的原理

在Spring Cloud中,@RefreshScope和@ConfigurationProperties是实现配置热更新的两种核心机制。它们的实现原理不同,但都依赖于Spring的配置管理能力和事件驱动机制

1、@RefreshScope的热更新原理

@RefreshScope是Spring Cloud提供的注解,用于实现Bean级别的热更新。它的核心思想是通过代理模式和缓存机制,在配置更新时动态刷新Bean的属性值。

1、核心实现机制

(1)、组合注解

@RefreshScope是一个组合注解,本质是@Scope(“refresh”),它定义了一个特殊的刷新作用域(Refresh Scope)。

代码示例:

@Target({ ElementTypeTYPE, ElementTypeMETHOD })
@Retention(RetentionPolicyRUNTIME)
@Scope("refresh")
public @interface RefreshScope {ScopedProxyMode proxyMode() default ScopedProxyModeTARGET_CLASS;
}
(2)、 代理模式
  • 被**@RefreshScope注解的Bean会被包装为代理对象**(通过ScopedProxyFactoryBean创建)。
  • 每次调用Bean的方法前,代理会先检查缓存中是否存在该Bean的实例
  • 如果缓存失效(如配置更新),则重新创建Bean实例,并从最新的Environment中读取配置值
(3)、缓存管理:
  • Spring Cloud使用GenericScope类管理Refresh Scope的Bean缓存。
  • 当配置更新时,Spring会发布RefreshEvent事件,触发缓存清空。
  • 下次调用Bean时,代理会重新创建实例,加载最新配置。

2、典型使用场景

动态刷新@Value注入的属性值。

代码示例:

@RestController
@RefreshScope
public class MyController {@Value("${message}")private String message;@GetMapping("/message")public String getMessage() {return message; // 配置更新后,message 会自动刷新}
}

3、热更新的流程

(1)、配置更新:Nacos配置中心或本地配置文件修改。
(2)、事件发布:Nacos客户端监听到变化后,触发RefreshEvent。
(3)、缓存清空:Spring Cloud清空GenericScope中的Bean缓存。
(4)、代理重建:下次调用Bean时,代理重新创建实例,加载最新配置。

4、限制

  • 仅适用于Bean作用域:只能刷新被@RefreshScope注解的Bean。
  • 无法直接刷新静态属性:如@Value(“${static.value}”)是静态变量时,无法自动刷新。
  • 需结合@Value使用:单独使用@ConfigurationProperties时,@RefreshScope无效。

2、@ConfigurationProperties的热更新原理

@ConfigurationProperties是Spring Boot提供的注解,用于将配置文件中的属性绑定到Java对象上。它的热更新依赖于属性绑定机制和环境事件监听

1、核心实现机制

(1)、属性绑定
  • 通过@ConfigurationProperties注解,将配置文件中的属性(如application.yml)映射到Java对象的字段。
  • Spring Boot使用ConfigurationPropertiesBindingPostProcessor实现属性绑定

代码示例:

@Component
@Data
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String name;  // 对应配置 app.nameprivate int version;  // 对应配置 app.version
}
(2)、热更新流程
  • 监听配置变化:当Nacos配置更新时,Spring Cloud会发布EnvironmentChangeEvent
    • 属性重新绑定:Spring Boot调用ConfigurationPropertiesRebinder,重新绑定配置到Bean
    • Bean更新:AppProperties的字段值会被更新为最新的配置值

2、典型使用场景

  • 复杂配置绑定:适合将配置文件中的嵌套结构映射到Java对象。

yaml示例:

app:name: my-appversion: 1.0.0features:enabled: true

java示例:

@Component
@Data
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String name;private int version;private Features features;public static class Features {private boolean enabled;}
}
  • 动态刷新整个配置对象:无需逐个使用@Value注入属性。

3、触发热更新的流程

1、配置更新:Nacos配置中心或本地配置文件修改
2、环境刷新:Spring Cloud更新Environment中的属性值
3、事件发布:发布EnvironmentChangeEvent,触发属性重新绑定
4、Bean 更新:ConfigurationPropertiesRebinder重新绑定属性到目标Bean

4、限制

  • 需要Spring Cloud上下文支持:需引入spring- cloud- context依赖
  • 无法直接刷新非Spring Bean:如未通过@Component或@Bean注册的类。
  • 性能开销:频繁更新配置可能触发多次属性绑定,影响性能

3、两者的区别与适用场景

在这里插入图片描述
说明:

  • @RefreshScope:适用于简单的配置刷新场景,例如某个Bean中使用**@Value(“${property}”) 注入的属性需要动态更新**。
  • @ConfigurationProperties:更适合结构化、层次化的配置管理,如将一组相关配置封装为一个POJO。配合@RefreshScope或Spring Cloud的自动刷新机制可实现动态更新,且与Nacos等配置中心集成更自然。

4、开发中的推荐实践

  • 推荐组合使用:
    对于需要动态刷新的配置对象,同时使用@ConfigurationProperties和@RefreshScope。

代码示例:

@Component
@RefreshScope
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String name;private int version;
}

说明:

  • @RefreshScope确保Bean被重新创建。

  • @ConfigurationProperties确保属性值从最新Environment中加载。

  • 避免滥用:

    • 对于静态配置(如数据库连接池大小),建议通过重启服务生效。
    • 对于高频更新的配置,需评估性能影响。

5、总结

  • @RefreshScope:通过代理和缓存机制实现Bean级别的热更新,适合动态刷新单个Bean的属性。
  • @ConfigurationProperties:通过属性绑定和事件监听实现配置对象的热更新,适合管理复杂配置结构。
  • 两者结合:在需要动态刷新复杂配置对象时,同时使用两者可以达到最佳效果。

向阳前行,Dare To Be!!!

http://www.xdnf.cn/news/1355725.html

相关文章:

  • Kubernetes笔记整合-1
  • 一种通过模板输出Docx的方法
  • LeakyReLU和ReLU的区别
  • 探索 JUC:Java 并发编程的神奇世界
  • KVM虚拟化:提升企业效率的利器
  • 【嵌入式】【搜集】RTOS相关技术信息整理
  • 微信小程序界面常用操作
  • SpringBoot自动装配原理深度解析
  • 电蚊拍的原理及电压电容参数深度解析:从高频振荡到倍压整流的完整技术剖析
  • Trae Solo模式生成一个旅行足迹App
  • 最新短网址源码,防封。支持直连、跳转。 会员无广
  • Azure Kubernetes Service (AKS)
  • 视觉革命:云渲染如何让创意不再受限于硬件
  • qt ElaWidgetTools第一个实例
  • leetcode刷题记录03——top100题里的6道简单+1道中等题
  • H264编解码过程简述
  • 算法 ---哈希表
  • C 语言标准输入输出头文件stdio.h及其常见用法
  • 【KO】前端面试六
  • 【40页PPT】企业如何做好大数据项目的选型(附下载方式)
  • 利用背景图片定位套打档案封面
  • 当AI成了“历史笔迹翻译官”:Manus AI如何破解多语言手写文献的“密码锁”
  • 1200 SCL学习笔记
  • 【Java SE】抽象类与Object类
  • 51单片机-实现外部中断模块教程
  • SpringBoot3整合dubbo3客户端【最佳实践】
  • 编程刷题-染色题DFS
  • 【C标准库】详解<stdio.h>标准输入输出库
  • CUDA和torch的安装
  • 什么是多元线性回归,系数、自变量、因变量是什么,多元线性回归中的线性是什么