SpringCloud配置動(dòng)態(tài)更新原理解析
一、SpringBoot、Cloud配置的讀取
1、SpringBoot啟動(dòng)時(shí)會(huì)讀取并解析配置文件中的配置到內(nèi)存變量,保存在Environment對(duì)象的屬性中。如果引入了配置中心如Nacos、Apollo,其中的配置也會(huì)被SpringBoot讀取并保存在Environment對(duì)象中。

2、可以使用編碼的方式獲取配置數(shù)據(jù):
String name = environment.getProperty("name");
3、可以使用@Value注解直接把配置賦值給Bean的屬性:

這里的name變量值直接來(lái)自于Environment對(duì)象。
二、SpringCloud配置動(dòng)態(tài)刷新
1、SpringBoot配置文件和SpringCloud配置中心中的配置,區(qū)別只是來(lái)源不同,都是被讀取加載到Environment對(duì)象中生效的:

2、當(dāng)配置中心修改了配置并發(fā)布時(shí),Server端會(huì)向Client端發(fā)送配置變化通知,Client端重新拉取配置并更新Environment對(duì)象中的配置數(shù)據(jù)(通常通過(guò)事件發(fā)布和監(jiān)聽機(jī)制來(lái)實(shí)現(xiàn))

此時(shí)如果使用編碼方式從Environment對(duì)象中獲取配置(而不是@Value注解的屬性),則已經(jīng)是更新后的值。
三、更新@RefreshScope注解Bean的屬性值
1、對(duì)于使用@Value注解獲取配置的屬性,不會(huì)隨配置數(shù)據(jù)的更新而更新,因?yàn)锽ean對(duì)象已經(jīng)創(chuàng)建完成,配置變化時(shí)只是更新Environment中的數(shù)據(jù),并沒有更新Bean屬性值的動(dòng)作發(fā)生。
2、但是如果Bean上有@RefreshScope注解,則其中的@Value屬性值會(huì)隨配置更新而更新。

原理:使用@RefreshScope標(biāo)記的Bean,Spring會(huì)為其創(chuàng)建代理對(duì)象,代理對(duì)象中持有原生對(duì)象,@Value的屬性值位于原生對(duì)象中。SpringBoot中的配置中心客戶端在收到服務(wù)端的變更通知后,會(huì)先后發(fā)布兩個(gè)事件:1、觸發(fā)Environment重新加載相關(guān)配置數(shù)據(jù)。2、觸發(fā)所有@RefreshScope的Bean置為null,則在這些Bean下次使用時(shí)重新創(chuàng)建,重新從Environment中獲取配置,即實(shí)現(xiàn)@Value屬性值的更新。


注:從SpringCloud配置動(dòng)態(tài)更新的原理可知,諸如數(shù)據(jù)庫(kù)連接配置,在配置中心修改了配置后只是會(huì)更新@RefreshScope注解Bean中的@Value屬性,如果要?jiǎng)討B(tài)修改數(shù)據(jù)庫(kù)信息,則還需要重建DataSource對(duì)象、清除舊連接等操作。
以上就是SpringCloud配置動(dòng)態(tài)更新原理解析的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud配置動(dòng)態(tài)更新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis分頁(yè)插件PageHelper手寫實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Mybatis分頁(yè)插件PageHelper手寫實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Mybatis-Plus根據(jù)自定義注解實(shí)現(xiàn)自動(dòng)加解密的示例代碼
我們把數(shù)據(jù)存到數(shù)據(jù)庫(kù)的時(shí)候,有些敏感字段是需要加密的,從數(shù)據(jù)庫(kù)查出來(lái)再進(jìn)行解密,如果我們使用的是Mybatis框架,那就跟著一起探索下如何使用框架的攔截器功能實(shí)現(xiàn)自動(dòng)加解密吧,需要的朋友可以參考下2024-06-06
強(qiáng)烈推薦IDEA提高開發(fā)效率的必備插件
這篇文章主要介紹了強(qiáng)烈推薦IDEA提高開發(fā)效率的必備插件,文中有非常詳細(xì)的圖文示例,對(duì)想要提高企業(yè)開發(fā)效率的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
10個(gè)Java解決內(nèi)存溢出OOM的方法詳解
在Java開發(fā)過(guò)程中,有效的內(nèi)存管理是保證應(yīng)用程序穩(wěn)定性和性能的關(guān)鍵,不正確的內(nèi)存使用可能導(dǎo)致內(nèi)存泄露甚至是致命的OutOfMemoryError(OOM),下面我們就來(lái)學(xué)習(xí)一下有哪些解決辦法吧2024-01-01
freemarker簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
FreeMarker是一個(gè)模板引擎,一個(gè)基于模板生成文本輸出的通用工具,使用純Java編寫,有興趣的可以了解一下2017-08-08
詳解Spring學(xué)習(xí)總結(jié)——Spring實(shí)現(xiàn)AOP的多種方式
這篇文章主要介紹了詳解Spring學(xué)習(xí)總結(jié)——Spring實(shí)現(xiàn)AOP的多種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
Java簡(jiǎn)單高效實(shí)現(xiàn)分頁(yè)功能
這篇文章主要介紹了Java簡(jiǎn)單高效實(shí)現(xiàn)分頁(yè)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot+Redis防止接口重復(fù)提交問(wèn)題
這篇文章主要介紹了SpringBoot+Redis防止接口重復(fù)提交問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06

