Nacos原始碼分析十 配置動態重新整理(3)

2021-10-14 04:08:09 字數 3532 閱讀 2826

回到nacoscontextrefresher類,看一下註冊監聽的**:

private void registernacoslistener(final string groupkey, final string datakey) 

}});

try

catch (naco***ception e)

}

當有配置變更時發布refreshevent事件,這個事件是refresheventlistener監聽的:

@override

public

void

else

if(event instanceof

refreshevent)}

public

void

handle

(refreshevent event)

}

跟進去:

public synchronized setrefresh()
先進行環境的重新整理:

public synchronized setrefreshenvironment()
addconfigfilestoenvironment方法:

try

mutablepropertysources target = this.context.getenvironment()

.getpropertysources();

string targetname = null;

for (propertysource> source : environment.getpropertysources())

if (!this.standardsources.contains(name))

else

else }}

}}finally

catch (exception e)

}else }}

return capture;}

changes獲取新老之間有差異的屬性源key集合:

private mapchanges(mapbefore,

mapafter)

else if (!equal(before.get(key), after.get(key)))

}for (string key : after.keyset())

}return result;

}

然後發布environmentchangeevent事件,這個事件是configurationpropertiesrebinder監聽的:

public class configurationpropertiesrebinder

...@override

// backwards compatible

|| event.getkeys().equals(event.getsource()))

} ...

}

然後是rebind方法:

public void rebind() 

}

這裡的beans是所有的配置屬性物件

遍歷rebind:

public boolean rebind(string name) 

try

if (bean != null)

.destroybean(bean);

.initializebean(bean, name);

return true;}}

catch (runtimeexception e)

catch (exception e)

}return false;

}

實際上就是先銷毀,然後重新初始化。

回去看scope做refresh操作。這個scope就是我們的refreshscope。再跟進去:

public void refreshall()
父類的destroy方法:

@override

public void destroy()

finally

}catch (runtimeexception e)

}if (!errors.isempty())

this.errors.clear();

}

public void destroy() 

synchronized (this.name)

this.callback = null;

this.bean = null;}}

貌似沒有做什麼,實際上核心**就是最後一行 this.bean = null;將被包裝的bean設定為null了,這樣下次取的時候發現是null就會再次建立:

public object getbean() }}

return this.bean;

}

@refreshscope和refreshscope的作用

首先被@refreshscope註解的bean會cglib動態**。實際上@scope就會被**。這是spring部分的內容,缺省會新增乙個delegatingintroductioninterceptor增強器。當前分析過程不需要關注這個增強器,因為對於@refreshscope定義的重新整理域來說,又在前面加了乙個新的增強器,這個增強器直接反射原方法就返回了,也就是把delegatingintroductioninterceptor遮蔽了。

– 為什麼要這麼做呢? 實際上spring-cloud就是擴充套件了scope作用域,定義了乙個重新整理域。因此使用了spring核心提供的擴充套件域的框架,但是不需要對原功能進行增強,所以加了乙個增強器直接把下層的遮蔽了。

實際上需要用到這個scope的動態**目的是為了每次都能通過gettarget獲得最新的被**物件:

refreshscope管理了被@refreshscope註解定義的bean的生命週期,提供了get(建立)、destory(銷毀)方法。

nacos通過發布refreshevent事件通知spring-cloud進行重新整理操作,spring-cloud監聽到事件後做兩件事:

重新整理屬性源–屬性源相對應的屬性bean從舊的換成新的

觸發scope的refreshall操作,針對refreshscope來說就是清空了他所管理的快取bean,待再次呼叫時重新建立,建立過程就會注入新的屬性源

Nacos原始碼一 原始碼啟動

一 nacos 原始碼本地啟動 官方單機啟動文件 將原始碼匯入到idea,然後開啟console專案中的配置檔案 按照nacos文件中單機啟動模式修改mysql配置 資料庫連線串需要有時區 useunicode true characterencoding utf8 servertimezone u...

bigchaindb原始碼分析(十) 總結

根據我們耗時如此長的原始碼分析,我們可以對bigchaindb進行一些初步的總結了 區塊 多個事務組成區塊,乙個區塊記錄了前乙個區塊的資訊,從而形成鏈。區塊的狀態有三種 投票 當乙個區塊被建立時,聯盟中的所有節點將會對區塊進行投票,這個投票主要驗證了寫區塊的節點的合法性 區塊簽名 區塊中所有事務的簽...

u boot原始碼配置原理分析

華清遠見嵌入式學院講師。u boot的源 預設是不針對任何目標平台的,當我們要移植u boot到乙個特定的目標平台時,需要生成針對目標平台的配置檔案。u boot目前已經支援的晶元可以在include configs 下面找到。比如我們要編譯針對s3c2410晶元的u boot.bin,那麼我們就需...