@RefreshScope 到底刷新了谁、没刷新谁?为什么我的 @Value 还是旧值?改了一个无关的配置也会重建 bean 吗?刷新之后第一个请求会变慢吗?这篇在 Spring Cloud 2025.1.3 上用五种读取配置的方式对比同一个 app.msg。
启动后 GET /v → @RefreshScope 的 @Value=v1,该 bean 被调用的次数(实例内计数)=1;普通单例的 @Value=v1;单例在构造时复制的值=v1;@ConfigurationProperties(setter)=v1;@ConfigurationProperties(record)=v1;RefreshBean 创建过 1 次、销毁过 0 次 文件改成 app.msg=v2,还没有刷新,GET /v → @RefreshScope 的 @Value=v1,该 bean 被调用的次数(实例内计数)=2;普通单例的 @Value=v1;单例在构造时复制的值=v1;@ConfigurationProperties(setter)=v1;@ConfigurationProperties(record)=v1;RefreshBean 创建过 1 次、销毁过 0 次 POST /actuator/refresh → 200 ["app.msg"] 刷新之后 GET /v → @RefreshScope 的 @Value=v2,该 bean 被调用的次数(实例内计数)=1;普通单例的 @Value=v1;单例在构造时复制的值=v1;@ConfigurationProperties(setter)=v2;@ConfigurationProperties(record)=v1;RefreshBean 创建过 2 次、销毁过 1 次
@RefreshScope bean 与 setter 绑定的 @ConfigurationProperties;单例的 @Value、构造时复制的值、record 绑定都不变。
只新增 other.unrelated=x,POST /actuator/refresh → 200 ["other.unrelated"] GET /v → @RefreshScope 的 @Value=v2,该 bean 被调用的次数(实例内计数)=1;普通单例的 @Value=v1;单例在构造时复制的值=v1;@ConfigurationProperties(setter)=v2;@ConfigurationProperties(record)=v1;RefreshBean 创建过 3 次、销毁过 2 次 什么都没改,再 POST /actuator/refresh → 200 [] GET /v → @RefreshScope 的 @Value=v2,该 bean 被调用的次数(实例内计数)=1;普通单例的 @Value=v1;单例在构造时复制的值=v1;@ConfigurationProperties(setter)=v2;@ConfigurationProperties(record)=v1;RefreshBean 创建过 4 次、销毁过 3 次
每次 refresh 销毁所有 @RefreshScope bean,与改了哪个 key 无关。
启动后第一次 GET /v 53 ms,第二次 2 ms POST /actuator/refresh 本身耗时 66 ms(返回 ["app.msg"]) 刷新后第一次 GET /v 408 ms(要重新创建 bean),第二次 3 ms
启动时提前创建,刷新后在下一次访问时重建,请求线程承担初始化耗时。