当前位置: 首页 > 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.zskr.cn/news/22070.html

相关文章:

  • P9403 [POI 2020/2021 R3] Les Bitrables
  • P5609 [Ynoi2013] 对数据结构的爱
  • STM32 代码
  • 剑指offer-35、数组中的逆序对
  • 2025 年太阳能厂家最新推荐:全场景系统企业综合实力榜,含热水 / 发电 / 光伏热等领域优质品牌测评
  • 完整教程:AI应用生成平台:数据库、缓存与存储
  • 2025 年电缆桥架生产厂家最新推荐排行榜:含北方 / 河北 / 瓦楞 / 防火 / 模压 / 镀锌桥架品牌及合作案例盘点
  • 2025 年胰岛素泵厂家最新推荐排行榜:国产实力厂家技术、口碑及全场景适配方案全景解析软针植入/平衡式留置针/无异物感胰岛素泵厂家推荐
  • 进程的内存管理
  • 深入理解Java内存模型与volatile关键字:从理论到实践
  • 312、金缕衣
  • AVG Clear:彻底卸载AVG产品的专业工具
  • 深入解析:安卓 WPS Office v18.21.0 国际版
  • 科学背景如何赋能云计算业务战略
  • .netframework中自带的dll
  • 【GitHub每日速递 251016】23k star,Daytona:90ms内极速运行AI代码,安全弹性基础设施来袭!
  • MVCC、幻读、间隙锁与临键锁(三)
  • 生物聚酯塑料回收技术创新与商业应用
  • # ️ MySQL vs PostgreSQL架构深度对比分析报告
  • # 韩国数据中心大火:647套系统因缺失双活集体宕机22小时
  • LlamaIndex API Example
  • 图文并茂展示CSS li 排版大合集,总有一款是你刚好需要的
  • The lamentable decline of reading
  • [FT.COM]The world should prepare for the looming quantum era
  • 函数的类型注释器
  • DshanPI-A1 RK3576 gmrender-resurrect B站投屏
  • 组件级异步加载与预加载策略
  • SAM系列论文浅析
  • 为什么一部电影,一本书一看就喜欢
  • 02020601 Web API01-顶级语句、全局using指令、可空类型、record类型(自动重写ToString、Equals)、init和private属性