修改了配置值,能自动刷新设置成最新值。
SessionScope是从Session中获取实例的,ThreadScope是从ThreadLocal中获取的,而RefreshScope是在内建缓存中获取的。
@Scope 对象的实例化,@RefreshScope 是scopeName=”refresh”的 @Scope。
@RefreshScope 实现流程
需要动态刷新的类标注@RefreshScope 注解。
@RefreshScope 注解标注了@Scope 注解,并默认了ScopedProxyMode.TARGET_CLASS; 属性,此属性的功能就是再创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象。
如属性发生变更
调用 ContextRefresher refresh() -->> RefreshScope refreshAll() 进行缓存清理方法调用;
发送刷新事件通知,GenericScope 真正的清理方法destroy() 实现清理缓存。
在下一次使用对象的时候,会调用GenericScope get(String name, ObjectFactory<?> objectFactory) 方法创建一个新的对象,并存入缓存中,此时新对象因为Spring 的装配机制就是新的属性了。
小结:
@Autowired方式注入的是代理对象
beanName的得到的是代理对象
scopedTarget.beanName的得到的@RefreshScope生成的那个原类对象
代理对象不会随着配置刷新而更新
@RefreshScope生成的那个原类对象会随着配置的刷新而更新(属性时清除原来的,使用时才生成新的)
原文链接:
https://blog.csdn.net/m0_71777195/article/details/127223544