redis配置中心原理篇

2021-10-08 09:39:45 字數 2696 閱讀 8802

所有的配置資料(xx.properties,xx.yml)都儲存在環境變數environment中,更改配置其實就是更改environment中的屬性值。

在單例bean中的@value註解配置的屬性值如何實現動態更新?單例bean只建立了一次,其餘取值都是從singleobjects快取中拿取。

如何解決這個問題?當然可以用多例,我們也可以自定義scope。

更新完environment環境變數以後,重新整理帶有我們自定義scope的beandefinition,重新建立bean。

如何自定義scope?如何獲取帶有自定義scope的beandefinition?

實現scope介面

public

class

refreshconfigscope

implements

scope

//getobject(),鉤子方法建立例項

object object = objectfactory.

getobject()

; caches.

put(s,object)

;return object;

}@override

public object remove

(string s)

@override

public

void

registerdestructioncallback

(string s, runnable runnable)

@override

public object resolvecontextualobject

(string s)

@override

public string getconversationid()

}

objectfactory.getobject()呼叫是在abstractbeanfactory.dogetbean()

string scopename = mbd.

getscope()

;//scopename為我們自定義的名稱,後面會講

scope scope =

(scope)

this

.scopes.

get(scopename)

;try

finally

return var4;})

; bean =

this

.getobjectforbeaninstance

(scopedinstance, name, beanname, mbd);}

catch

(illegalstateexception var23)

scope註冊到spring中

實現beandefinitionregistrypostprocessor介面

public

class

refreshconfigscoperegistry

implements

beandefinitionregistrypostprocessor

@override

public

void

postprocessbeanfactory

(configurablelistablebeanfactory configurablelistablebeanfactory)

throws bean***ception

public beandefinitionregistry getbeandefinitionregistry()

}

建立自定義的環境變數propertysource
//建立redis-propertysources 環境資源

private

void

createredisspringproperty()

從redis中查詢配置資料-寫入自定義的環境變數中
try

catch

(exception e)

if(properties.

isempty()

)return

;getenvironment()

.getpropertysources()

;//redissourcename自定義的propertysources名稱

propertysource<

?> source = propertysources.

get(redissourcename)

;concurrenthashmap concurrenthashmap =

(concurrenthashmap) source.

getsource()

;concurrenthashmap.

clear()

;set

keys = properties.

keyset()

;//遍歷並寫入環境變數中

for(object key : keys)

重新整理帶有自定義scope的bean
//更新@value 相關屬性值

private

void

refreshbean()

}}

專案位址

倒車雷達原理篇

往後倒一點,再往後,打方向盤,打多了,回一點再倒,好,停!相信一般的車主在停車場泊位時,都會遇到車輛保管員的 熱情招呼 車技純熟的倒 也與人工提示配合默契 車技一般 方向感較差的,就經常使負責指揮的那位人士高度緊張,脾氣急躁的還少不了擠兌車主幾句。可是,並不是所有車主都有幸得到 人工倒車指引,比如說...

iOS知識原理篇

weak策略表明該屬性定義了一種 非擁有關係 nonowning relationship 為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似 然而在屬性所指的物件遭到摧毀時,屬性值也會清空 nil out runtime對註冊的類,會進行布局,會將 weak 物件放...

MongoDB分片原理篇

mongodb目前3大核心優勢 靈活模式 高可用性 可擴充套件性 通過json文件來實現靈活模式,通過複製集來保證高可用,通過sharded cluster來保證可擴充套件性。何時使用分片技術 儲存容量需求超出單機磁碟容量 活躍的資料集超出單機記憶體容量,導致很多請求都要從磁碟讀取資料,影響效能 寫...