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

对比@ConfigurationProperties和@Value在动态配置刷新中的差异,以及@RefreshScope对 Bean 生命周期的影响

package com.liftsail.system.nacostest;import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.sql.DataSource;/*** @Author: liftSail* @Date: 2024/11/20 11:31* @Description: 不积跬步无以至千里*/
@RestController
@RefreshScope // 懒加载刷新(重新实例化bean) @RefreshScope优先级大于@ConfigurationProperties
@ConfigurationProperties(prefix = "nacosconfigtest") // 无需搭配@RefreshScope也可实现刷新,需setter与getter方法,即时刷新(不会重新实例化bean)
public class NacosConfigTest implements InitializingBean {public NacosConfigTest() {System.out.println("NacosConfigTest构造方法被执行了");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("NacosConfigTest-afterPropertiesSet方法被执行了-refreshString:" + refreshString + "-" + refreshStringValue);}// @Value("${NacosConfigTest.refreshString:reject}")private String refreshString;// 必须搭配@RefreshScope实现字段刷新,无需setter与getter方法@Value("${nacosconfigtest.refreshString:reject}")private String refreshStringValue;@Resourceprivate DataSource dataSource;@GetMapping("/my-property")public String getProperty() {System.out.println(refreshString);Class<? extends DataSource> aClass = dataSource.getClass();return refreshString + "-" + refreshStringValue;}// public String getRefreshString() {//     return refreshString;// }//// public void setRefreshString(String refreshString) {//     this.refreshString = refreshString;// }
}
这段代码是一个 Spring Boot 控制器类,主要用于测试 Nacos 配置中心的动态配置刷新功能,结合了@RefreshScope@ConfigurationProperties@Value等注解的使用,并通过初始化方法和构造方法验证 Bean 的生命周期。以下是详细解析:

1. 类注解与作用

@RestController @RefreshScope @ConfigurationProperties(prefix = "nacosconfigtest") public class NacosConfigTest implements InitializingBean { ... }

  • @RestController:标记该类为 REST 控制器,可处理 HTTP 请求并返回 JSON / 字符串等响应。
  • @RefreshScope:Spring Cloud 提供的注解,标记该 Bean 属于 “刷新作用域”。当配置变更并触发刷新时,该 Bean 会被销毁并重新实例化,新实例会加载最新配置。
  • @ConfigurationProperties(prefix = "nacosconfigtest"):将配置文件中nacosconfigtest前缀的配置项绑定到当前类的属性上(需配合 getter/setter 方法)。
  • implements InitializingBean:实现 Spring 的初始化接口,重写afterPropertiesSet()方法,在 Bean 初始化完成后执行特定逻辑。

2. 构造方法与初始化方法

public NacosConfigTest() { System.out.println("NacosConfigTest构造方法被执行了"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("NacosConfigTest-afterPropertiesSet方法被执行了-refreshString:" + refreshString + "-" + refreshStringValue); }

  • 构造方法:Bean 实例化时调用,打印日志用于观察 Bean 的创建时机(尤其是@RefreshScope触发刷新时,会重新执行)。
  • afterPropertiesSet():Bean 初始化完成后(属性注入后)调用,打印当前配置值,用于验证初始化时的配置状态。

3. 属性与配置绑定

// 方式1:@ConfigurationProperties绑定(需setter/getter,注释中已说明) private String refreshString; // 方式2:@Value注解注入 @Value("${nacosconfigtest.refreshString:reject}") private String refreshStringValue; @Resource private DataSource dataSource;

  • refreshString:通过@ConfigurationProperties绑定配置nacosconfigtest.refreshString。
     
    注:代码中注释了其 getter/setter,实际使用时需放开,否则绑定失败(@ConfigurationProperties依赖 setter 注入)。
  • refreshStringValue:通过@Value直接注入配置nacosconfigtest.refreshString,默认值为reject。
     
    注:@Value单独使用时无法动态刷新,需配合@RefreshScope才能在配置变更后更新。
  • dataSource:注入数据源 Bean,用于演示非配置属性的依赖(刷新时不会重新创建数据源,仅当前 Bean 重建)。

4. 接口方法

  • 提供 HTTP GET 接口/my-property,返回当前refreshStringrefreshStringValue的值,用于验证配置是否生效。
  • 打印refreshString并获取数据源类型,辅助观察配置刷新和 Bean 依赖的状态。

5. 代码注释解析与验证点

代码中的注释提到了几个关键结论,可通过测试验证:
  1. @RefreshScope@ConfigurationProperties的优先级:注释称@RefreshScope优先级更高,实际表现为:当两者同时存在时,配置刷新会触发 Bean 重建(执行构造方法),而@ConfigurationProperties的绑定会在新实例中重新执行。
  2. @ConfigurationProperties的刷新特性:注释提到 “无需搭配@RefreshScope也可实现刷新”,这是因为@ConfigurationProperties通过@ConfigurationPropertiesBindingPostProcessor实时监听配置变化,直接更新属性值(不重建 Bean),但需依赖 setter 方法。
  3. @Value的刷新条件:注释指出@Value必须搭配@RefreshScope才能刷新,因为@Value是在 Bean 初始化时注入值,无动态更新机制,只有@RefreshScope触发 Bean 重建时才会重新注入新值。

测试场景建议

  1. 启动应用,访问/my-property,观察初始配置值和控制台输出(构造方法、afterPropertiesSet执行)。
  2. 修改 Nacos 中nacosconfigtest.refreshString的配置值。
  3. 调用/actuator/refresh端点触发刷新,再次访问/my-property,观察:
    • 控制台是否重新执行构造方法和afterPropertiesSet(验证@RefreshScope触发 Bean 重建)。
    • 返回的配置值是否更新(验证@ConfigurationProperties@Value的刷新效果)。
    • 数据源类型是否不变(验证依赖 Bean 不随当前 Bean 刷新而重建)。

注意事项:

nacos配置中心共享配置默认配置不会触发推送

this.refresh = false;
spring:cloud:nacos:discovery:# 服务注册地址server-addr: 127.0.0.1:8848# 命名空间namespace: *********group: *********config:# 配置中心地址server-addr: 127.0.0.1:8848# 命名空间namespace: *********group: *********# 配置文件格式file-extension: yml# 共享配置shared-configs:- dataId: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}group: DEFAULT_GROUPrefresh: true # 此配置决定nacos共享配置文件改变后是否触发推送

 

http://www.jsqmd.com/news/14516/

相关文章:

  • 还在手动Code Review?给你的GitHub项目请一个免费的AI审查官吧!
  • 【光照】UnityURP[泛光Bloom]原理与实现
  • 学习Linux应该从哪里开始?
  • P9403 [POI 2020/2021 R3] Les Bitrables
  • Cartesian MST
  • P5609 [Ynoi2013] 对数据结构的爱
  • 剪映高级感口播动态文字字幕排版预设标题入场出场动画素材850款
  • JavaScript 中的安全编码:10 个关键实践
  • 2025 年最新推荐!国内优质球墨铸铁管厂家排行榜,涵盖市政 / 给水 / 水利工程适用产品
  • STM32 代码
  • 2025 年最新冷水机定制厂家排行榜:工业 / 防爆 / 低温 / 水冷 / 螺杆 / 超低温等多类型冷水机优质品牌推荐
  • 2025 年飞机票预定公司最新推荐排行榜:聚焦专业诚信,覆盖特殊旅客与企业服务的口碑榜单
  • 2025 年水质测定仪厂家最新推荐排行榜:解析科技等优质企业实力领衔,助您精准选品多参数/便携式/cod快速/台式水质测定仪厂家推荐
  • 2025 年电永磁吊具厂家最新推荐排行榜:涵盖多类型吊具优质厂家及专业选型参考大型电/全覆盖电/起重电永磁吊具厂家推荐
  • Redis布隆过滤器 Redisson 汇总
  • 2025 年电子散热器厂家推荐:镇江新区富利电子散热器厂,多领域适配与品质服务的可靠之选
  • 高级 RAG 实战:Neo4j 与 LangChain 构建知识图谱驱动的 AI 系统
  • 朴诚乳业携手纷享销客CRM6周实现项目全国推广(附9大核心能力)
  • 2025 年最新推荐 AI 健康管理公司榜单:覆盖多场景,为机构选品提供权威参考
  • 从playfield开源代码复制的opensl es初始化代码
  • 2025 年螺带混合机优质厂家最新推荐排行榜:聚焦综合实力、产品性能与服务质量的权威筛选榜单
  • P2151 HH 去散步
  • 2025年钢结构建材厂家最新推荐排行榜,彩钢瓦,镀锌板,折弯件,C型钢,Z型钢,压型瓦,楼承板,钢结构安装,次檩条公司推荐
  • 2025年发电机组厂家最新权威推荐榜:柴油/燃气/船用/静音箱式/移动拖车/集装箱发电机组,上柴/玉柴/潍柴/康明斯/沃尔沃/道依茨/帕金斯/MTU品牌全覆盖
  • 2025年铣刀厂家最新权威推荐榜:雕刻机铣刀/金刚石铣刀/木工铣刀/绝缘材料铣刀/碳纤维铣刀/亚克力铣刀/金属加工铣刀/铝合金铣刀/石墨铣刀/不锈钢铣刀/金属切削铣刀/电木铣刀/塑胶铣刀/PC铣刀
  • 2025年下半年权威信息公布:西安学区房/书包房/五大名校/交大书包新楼盘口碑推荐榜前十强出炉,高得房率/推荐好房/地铁口/小高层/低总价/低单价/高性价比/高赠送/四代宅
  • .NET 10中GC(垃圾收集器)更新
  • 【转】扫盲:Windows桌面应用开发框架:原生、跨平台、云桌面
  • vxe-table v4版本使用注意事项
  • ​​电容瞬态放电原理:大电流的产生机制深度解析​