所有的配置資料(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來保證可擴充套件性。何時使用分片技術 儲存容量需求超出單機磁碟容量 活躍的資料集超出單機記憶體容量,導致很多請求都要從磁碟讀取資料,影響效能 寫...