Spring 中 @scope 注解的原理就是在创建 Scope=singleton 的 Bean 时,IOC 会保存实例在一个 Map 中,保证这个 Bean 在一个 IOC 上下文有且仅有一个实例。看完 @RefreshScope 的原理相信大家已经知道了出现两个 NewUserInvitedListener 类型 bean 的缘故原由是在于 @RefreshScope 导致。这是由于 @RefreshScope 注解的内部实现创建了另外一个相同类型的 NewUserInvitedListener bean,导致我们的新用户监听逻辑被重复执行。
SpringCloud 新增了一个自定义的作用域:refresh(可以明白为“动态刷新”),同样用了一种独特的方式改变了 Bean 的管理方式,使得其可以通过外部化配置(.properties)的刷新,在应用不需要重启的环境下热加载新的外部化配置的值。
这个 scope 是怎样做到热加载的呢?RefreshScope 紧张做了以下动作:
单独管理 Bean 生命周期
创建 Bean 的时间如果是 RefreshScope 就缓存在一个专门管理的 ScopeMap 中,这样就可以管理 Scope 是 Refresh 的 Bean 的生命周期了(所以含 RefreshScope 的其实一共创建了两个 bean)。
重新创建 Bean
外部化配置刷新之后,会触发一个动作,这个动作将上面的 ScopeMap 中的 Bean 清空,这样这些 Bean 就会重新被 IOC 容器创建一次,使用最新的外部化配置的值注入类中,到达热加载新值的结果。
贴一下原文地址:https://blog.csdn.net/m0_71777195/article/details/127223544一些思索
如果以为这篇文章写的不错的话,可以关注我的公众号【步伐员wayn】,我会更新更多技术干货、项目教学、经验分享的文章。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |