您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關SpringCloud中怎么使用RefreshScope刷新配置信息,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
我們有一個配置類:
@Component("smsTemplateConfig") @ConfigurationProperties(prefix = "zt.sms") @Data //注意如下注解 @RefreshScope @Slf4j public class SmsTemplateConfig { /** * 是否發送短信 */ private Boolean send; /** * 短信位數 */ private Integer msgCodeDigits; @PostConstruct private void initialize() { log.info("SmsTemplateConfig initialized - send: {},msgCodeDigits: {}", send, msgCodeDigits); } }
該配置類,會在如下類種被用到:
@Component public class MsgUtils { @Autowired private SmsTemplateConfig config; public SmsTemplateConfig getConfig() { return config; } }
該配置類是關于短信配置相關的,然后,我們在配置中心修改了這個配置信息,那么服務就可以通過SpringCloud的RefreshScope這個類來熱加載配置信息,代碼如下:
RefreshScope.refresh("smsTemplateConfig");
RefreshScope的原理是:會先摧毀(destory),名稱為smsTemplateConfig這個實例,然后當smsTemplateConfig這個實例再被用到的時候再重新初始化。
那么,問題來了,MsgUtils 這個類是單例,在容器中只會初始化一次,容器不會再幫我們注入新的smsTemplateConfig實例,那么smsTemplateConfig被銷毀之后,是如何重新初始化的呢?
普及兩個概念:
1.Spring中bean的生命周期可以用類Scope來標識,生命周期(Scope的子類)有Singleton,Prototype,Request,Session,SpringCloud又新增了Thread,Refresh這幾種,其中Singleton和Prototype是單獨的類,其它的都是Scope的子類 ;不同生命周期的Bean由各自對應的Scope來管理。
2.Spring對非Singleton的Scode都使用了代理機制。
基于上面兩個概念, 我們SmsTemplateConfig這個類上面有@RefreshScope這個注解,這個注解表示這個類的Scope是Refresh,也就是說,我們每次調用smsTemplateConfig這個實例,其實調用的是它的代理類。
有了這個結論之后,我們就需要去看代理類中添加了哪些邏輯,具體過程太復雜,這里直接說結論:每次通過代理對象執行原始對象的方法時,我們肯定要獲取到原始對象,這里,我們的原始對象smsTemplateConfig,它的生命周期是refresh,所以由RefreshScope管理,所以需要先獲取自身對應的RefreshScope,然后通過RefreshScope獲取對應實例,到了這一步,馬上就要揭開謎底了,既然是由RefreshScope獲取對應實例的,那么我就要看RefreshScope獲取的邏輯就好了,這里也是直接說結論,RefreshScope類內部有一個緩存,緩存了所有的生命周期為refresh的實例,假如緩存沒有命中,就會重新生成對應的實例,在前文中我們是不是摧毀了smsTemplateConfig的實例,那么在這里就會重新生成,也就是重新初始化了smsTemplateConfig實例。
關于SpringCloud中怎么使用RefreshScope刷新配置信息就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。