Nacos(SpringBoot)配置加載及刷新方式
Nacos(SpringBoot)配置加載及刷新
pom文件
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.12</version>
</dependency>看看對應(yīng)的META-INF/spring.factories,這里我們主要研究NacosConfigAutoConfiguration


如圖,@EnableNacosConfig 字面意思 開啟nacos配置,我們看下這個注解

這里引入了NacosConfigBeanDefinitionRegistrar,這個關(guān)鍵了,我們看看它都注入了哪些bean

這里我們看看這個postProcessor
在registerNacosConfigBeans中注入

然后invokeNacosPropertySourcePostProcessor調(diào)用


這里就是尋找nacosPropertySources(@NacosPropertySources或者@NacosPropertySource的元屬性)
首先調(diào)用addNacosPropertySource添加到environment

接下來就是看看是否配置了自動刷新,如果是,則會添加一個監(jiān)聽器;

監(jiān)聽器做的就是替換environment中的舊值;
接下來我們看一下
com.alibaba.nacos.spring.context.event.config.EventPublishingConfigService#addListener

加入之前,做了個適配,然后再加入。
我們看看這個DelegatingEventPublishingListener做了什么

再收到配置信息時,首先調(diào)用了實際的監(jiān)聽器的監(jiān)聽方法去替換環(huán)境中的配置,然后發(fā)布了NacosConfigReceivedEvent。接下來我們看看誰監(jiān)聽了這個事件,也是@NacosValue能夠刷新的原因所在
NacosValueAnnotationBeanPostProcessor
先看看@NacosValue是如何取值的
了解Spring中bean的創(chuàng)建的都知道,屬性注入是在populateBean()階段,調(diào)用后置處理器的postProcessPropertyValues()方法進行注入,NacosValueAnnotationBeanPostProcessor繼承了
com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor,這里記錄了一個大致流程
org.springframework.beans.factory.annotation.InjectionMetadata#inject--->

com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.AnnotatedFieldElement#inject

com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor#getInjectedObject

doGetInjectedBean是個抽象方法,我們看一下NacosValueAnnotationBeanPostProcessor的實現(xiàn)


可以看到,最終就是這樣拿到了值,然后進行注入。
接下來是值的自動刷新
說刷新之前,看一下下面這段代碼,也就是處理了哪些值進行自動刷新

這里先后處理了字段和方法

經(jīng)過上面的處理,將autoRefreshed為true的目標加入到placeholderNacosValueTargetMap中去。
前面我們提到,NacosValueAnnotationBeanPostProcessor監(jiān)聽了NacosConfigReceivedEvent
我們看一下它的實現(xiàn)

簡單說呢,就是遍歷上面的placeholderNacosValueTargetMap進行一個值的更新。
總結(jié)
由上我們可知nacos在springboot環(huán)境下配置加載及刷新的大致過程
在平時使用時,如果要實現(xiàn)自動刷新,@NacosPropertySource和@NacosValue兩個注解的autoRefresh屬性必須同時為true,使用Spring的注解@Value可以注入,但無法實現(xiàn)自動刷新
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis的TypeHandler加解密數(shù)據(jù)實現(xiàn)
在我們數(shù)據(jù)庫中有些時候會保存一些用戶的敏感信息,所以就需要對這些數(shù)據(jù)進行加密,那么本文就介紹了Mybatis的TypeHandler加解密數(shù)據(jù)實現(xiàn),感興趣的可以了解一下2021-06-06
springboot集成nacos實現(xiàn)自動刷新的示例代碼
研究nacos時發(fā)現(xiàn),springboot版本可使用@NacosValue實現(xiàn)配置的自動刷新,本文主要介紹了springboot集成nacos實現(xiàn)自動刷新的示例代碼,感興趣的可以了解一下2023-11-11
SpringBoot集成Druid連接池連接MySQL8.0.11
這篇博客簡單介紹spring boot集成druid連接池的簡單配置和注意事項,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07

