1. @RefreshScope 刷新 Bean 时,正在处理的请求和旧实例会怎样变化,哪些对象不适合动态刷新
@RefreshScope 刷新 Bean 时,正在处理的请求和旧实例会怎样变化?哪些对象不适合动态刷新?
- @RefreshScope 重建 Bean 的机制
- 旧实例与进行中请求的处理
- 连接池、长连接等不适合动态刷新的对象
@RefreshScope 刷新时会清空 scope 缓存,把旧 Bean 实例标记为废弃,下一次访问时创建新实例。正在处理中的请求仍持有旧实例引用,它们会继续用旧配置完成当前请求,不会中断;只有新请求才使用新实例。因此刷新是"优雅的",不会打断进行中的请求,但旧实例若持有资源(如连接池、WebSocket、线程)可能造成资源泄漏。不适合动态刷新的对象:连接池(DataSource、Redis 连接池)、长连接会话、含大量内部状态的缓存、线程池、单例基础设施 Bean——这些对象重建代价高且易造成旧连接泄漏,应避免用 @RefreshScope 管理,而应通过局部更新或重启类机制处理。
核心是"副本集 + 惰性重建"。进行中请求用旧副本,新请求用新副本,保证一致性又不断流。但资源型对象重建会泄漏旧连接,需谨慎。工程上配置 Bean 用 @ConfigurationProperties + @RefreshScope,资源型对象不用。