回到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,那麼我們就需...