最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

@RefreshScope(nacos配置熱更新方式)

 更新時間:2024年12月10日 11:44:18   作者:ke_ek121  
文章主要介紹了Spring和Nacos對`@RefreshScope`注解的處理方式,Spring在每次調(diào)用被`@RefreshScope`注解的bean的屬性時,會先從本地緩存獲取,如果緩存不存在則重新創(chuàng)建并獲取最新環(huán)境配置

@RefreshScope(nacos配置熱更新)

源碼分析

宏觀流程解析

1.spring對@RefreshScopre注解的bean做的事情

  • 當(dāng)調(diào)用被@RefreshScope注解的bean的屬性的get方法時 則先從本地緩存里面獲取
  • 當(dāng)本地緩存中 不存在當(dāng)前bean時 則重新創(chuàng)建 此時 會獲取 spring中最新環(huán)境配置
  • 如果本地緩存中 存在當(dāng)前 bean則 直接返回對應(yīng)屬性值

2.nacos對@RefreshScopre注解的bean做的事情

  • 當(dāng)配置更改時 nacos服務(wù)端會發(fā)步一個配置已被更新事件
  • 此時 naocs客戶端 會接受到這個事件 接受到以后 會再在spring中發(fā)布環(huán)境配置刷新事件
  • 然后 對應(yīng)的監(jiān)聽器 收到以后 則刷新spring環(huán)境配置 以及 清空本地緩存

源碼解析

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Scope("refresh")
@Documented
public @interface RefreshScope {

	/**
	 * @see Scope#proxyMode()
	 * @return proxy mode
	 */
	ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;

}
org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan

org.springframework.context.annotation.AnnotationConfigUtils#applyScopedProxyMode
-->org.springframework.context.annotation.ScopedProxyCreator#createScopedProxy
-->org.springframework.aop.scope.ScopedProxyUtils#createScopedProxy

org.springframework.cloud.context.scope.GenericScope#postProcessBeanDefinitionRegistry

org.springframework.cloud.context.scope.GenericScope.LockedScopedProxyFactoryBean#setBeanFactory

org.springframework.aop.scope.ScopedProxyFactoryBean#setBeanFactory

創(chuàng)建代理

------由上可知,被@RefreshScope注解的bean被包裝為一個

FactoryBean(org.springframework.cloud.context.scope.GenericScope.LockedScopedProxyFactoryBean)

由此調(diào)用時就會調(diào)用getObject()方法,這樣就會得到一個代理對象,執(zhí)行時會獲取到目標(biāo)對象 SimpleBeanTargetSource.getTarget(),以"scopedTarget."開頭的bean,接下來看一下該bean的創(chuàng)建時機

創(chuàng)建target

org.springframework.cloud.context.scope.refresh.RefreshScope#onApplicationEvent

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

org.springframework.cloud.context.scope.GenericScope#get

以上即@RefreshScope的相關(guān)對象的創(chuàng)建

由上可知,目標(biāo)類都會存于scope的cache里

NacosContextRefresher(nacos配置刷新)

public class NacosContextRefresher
		implements ApplicationListener<ApplicationReadyEvent>, ApplicationContextAware

{
    public void onApplicationEvent(ApplicationReadyEvent event) {
		// many Spring context
		if (this.ready.compareAndSet(false, true)) {
			this.registerNacosListenersForApplications();
		}
	}

}
com.alibaba.cloud.nacos.refresh.NacosContextRefresher#registerNacosListenersForApplications
--->com.alibaba.cloud.nacos.refresh.NacosContextRefresher#registerNacosListener

注冊監(jiān)聽器,監(jiān)聽nacos配置變化,并發(fā)布RefreshEvent

org.springframework.cloud.endpoint.event.RefreshEventListener#onApplicationEvent

org.springframework.cloud.context.refresh.ContextRefresher#refresh

1.刷新了環(huán)境,2清空cache

首先刷新環(huán)境

如下,有個前后對比,關(guān)鍵就在addConfigFilesToEnvironment()

首先copyEnvironment,雖說是copy,這里只保留了一些最基本的配置,如下

第二步,創(chuàng)建Spring容器 capture = builder.run();

這里還是走之前的邏輯,具體可參考

nacos(SpringCloud)配置加載

只是這次創(chuàng)建的兩個Spring容器都為AnnotationConfigApplicationContext,并且用完就關(guān)了

我們看一下方法執(zhí)行之后的environment

之后的邏輯就是對比兩個環(huán)境進行替換了,這就是刷新環(huán)境的大致流程

然后清空cache

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java基于dom4j包實現(xiàn)對XML解析的方法

    java基于dom4j包實現(xiàn)對XML解析的方法

    這篇文章主要介紹了java基于dom4j包實現(xiàn)對XML解析的方法,結(jié)合實例形式分析了java針對xml格式數(shù)據(jù)的相關(guān)解析操作實現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • mybatis中的if-else及if嵌套使用方式

    mybatis中的if-else及if嵌套使用方式

    這篇文章主要介紹了mybatis中的if-else及if嵌套使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot靜態(tài)資源映射規(guī)則淺析

    SpringBoot靜態(tài)資源映射規(guī)則淺析

    這篇文章主要介紹了SpringBoot靜態(tài)資源映射規(guī)則,今天在玩SpringBoot的demo的時候,放了張圖片在resources目錄下,啟動區(qū)訪問的時候,突然好奇是識別哪些文件夾來展示靜態(tài)資源的, 為什么有時候放的文件夾不能顯示,有的卻可以
    2023-02-02
  • IDEA如何將Java項目打包成可執(zhí)行的Jar包

    IDEA如何將Java項目打包成可執(zhí)行的Jar包

    在Java開發(fā)中,我們通常會將我們的項目打包成可執(zhí)行的Jar包,以便于在其他環(huán)境中部署和運行,本文將介紹如何使用IDEA集成開發(fā)環(huán)境將Java項目打包成可執(zhí)行的Jar包,感興趣的朋友一起看看吧
    2023-07-07
  • Java中List對象集合按對象中某字段進行排序舉例

    Java中List對象集合按對象中某字段進行排序舉例

    這篇文章主要給大家介紹了關(guān)于Java中List對象集合按對象中某字段進行排序的相關(guān)資料,我們在日常開發(fā)中也經(jīng)常會用到排序算法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • SpringBoot 啟動報錯Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379問題的解決方案

    SpringBoot 啟動報錯Unable to connect to 

    這篇文章主要介紹了SpringBoot 啟動報錯Unable to connect to Redis server: 127.0.0.1/127.0.0.1:6379問題的解決方案,文中通過圖文結(jié)合的方式給大家講解的非常詳細,對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-10-10
  • springboot入門篇HelloWorld(圖文教程)

    springboot入門篇HelloWorld(圖文教程)

    springboot?springboot是一個全新的框架,它設(shè)計的目的簡化spring項目的初始環(huán)境的搭建和開發(fā),下面這篇文章主要給大家介紹了關(guān)于springboot入門篇HelloWorld的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 快速了解Maven

    快速了解Maven

    這篇文章主要介紹了快速了解Maven,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring定時任務(wù)輪詢本地數(shù)據(jù)庫實現(xiàn)過程解析

    Spring定時任務(wù)輪詢本地數(shù)據(jù)庫實現(xiàn)過程解析

    這篇文章主要介紹了Spring定時任務(wù)輪詢本地數(shù)據(jù)庫實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • MybatisPlus 自定義.vm模板的生成

    MybatisPlus 自定義.vm模板的生成

    為更加快捷方便的開發(fā)代碼,使用MybatisPlus的代碼自動生成功能,將一些繁瑣的操作自動生成,本文主要介紹了MybatisPlus 自定義.vm模板的生成,感興趣的可以了解一下
    2024-03-03

最新評論

卓资县| 承德县| 陆河县| 甘南县| 景洪市| 子长县| 南和县| 大名县| 保靖县| 和田县| 常熟市| 象州县| 喀喇| 海安县| 潮安县| 天等县| 元阳县| 凉城县| 邯郸县| 夏津县| 广西| 监利县| 容城县| 津南区| 灵武市| 菏泽市| 乌海市| 鹤壁市| 稷山县| 白沙| 阳原县| 伊宁县| 东乌| 新疆| 广昌县| 通许县| 西安市| 蓬安县| 承德市| 丹寨县| 桓台县|