在預設情況下,
而不是幾個小時甚至幾天後才發現這些錯誤。當這些行為不適合我們的時候,我們可以通過定義bean為延遲初始化阻止 singleton bean 的 pre-instantiated
。乙個延遲載入的bean會告訴ioc容器,第一次使用它的時候建立bean,而不是在啟動的時候建立。
在xml檔案中,這些行為是通過 節點裡面的 lazy-init屬性控制;例如:id=
"lazy"
class
="com.foo.expensivetocreatebean"
lazy-init
="true"
/>
name
="not.lazy"
class
="com.foo.anotherbean"
/>
啟動時會馬上 pre-instantiated 那些定義為 not.lazy
的 bean。
你也可以通過使用節點裡面的default-lazy-init變數在容器水平上控制延遲載入。例如:
程式設計方式實現sping bean延遲初始化
結果失敗了 原因是最外層的 ult lazy init設定對import的bean配置無效.後來經過檢視bean factory初始化的源 終於找到了解決辦法,可以通過程式設計方式來實現在測試的時候延遲初始化所有的bean,做法如下 override protected void loadbeand...
延遲初始化的競態條件
使用 先檢查後執行 的一種常見情況就是延遲初始化。延遲初始化的目的是將物件的初始化推遲到實際使用時才進行,同時要確保只被初始化一次。public class lazyinitrace 如上 getinstance方法首先判斷expensiveobject是否已經被初始化,如果已經初始化則返回現有的例...
雙重檢查鎖定和延遲初始化
在多執行緒程式中,有時候我們需要採用延遲初始化來降低初始化類和建立物件的開銷 使用synchronized延遲初始化的弊端 使用synchronized降低效能開銷,如果該同步方法被多個執行緒頻繁呼叫,將會導致程式執行效能的下降 使用雙重檢查鎖定來延遲初始化的好處 多個執行緒試圖在同一時間建立物件時...