Scope註解 詳細講解及示例

2021-10-21 02:50:55 字數 4277 閱讀 3622

4.惡漢/懶漢

5.bean例項物件的銷毀

6.@scope註解的使用場景

@scope註解是 spring ioc 容器中的乙個作用域,在 spring ioc 容器中,他用來配置bean例項的作用域物件。@scope 具有以下幾種作用域:

singleton 單例項的(單例)(預設)   ----全域性有且僅有乙個例項prototype 多例項的(多例)   ---- 每次獲取bean的時候會有乙個新的例項reqeust    同一次請求 ----request:每一次http請求都會產生乙個新的bean,同時該bean僅在當前http request內有效session    同乙個會話級別 ---- session:每一次http請求都會產生乙個新的bean,同時該bean僅在當前http session內有效注:這邊只演示我們常用的 singleton、prototype 兩種,其他的可以自己試試

直接在bean物件方法上增加@scope註解即可。① 在不指定@scope的情況下,所有的bean都是單例項的bean,而且是餓漢模式載入(容器啟動例項就建立好了)

@bean

public person person()

②指定@scope為prototype表示為多例項的,而且還是懶漢模式載入(ioc容器啟動的時候,並不會建立物件,而是 在第一次使用的時候才會建立)

@bean

@scope

(value =

"prototype"

)public person person()

/**

* person類

*/public

class

person

}

/**

* todo 主配置類

* * @author : lzb

* @date: 2021-03-05 13:50

*/@configuration

public

class

beanconfig

}

@scope註解預設為singleton單例,singleton例項的意思不管你使用多少次在springioc容器中只會存在乙個例項,演示如下只列印了一次建立例項:

public

class

}

執行結果:

可以發現singleton單例模式,在ioc容器中只會有乙個例項存在,每次getbean()獲取的例項物件都是同乙個。

/**

* todo 主配置類

* * @author : lzb

* @date: 2021-03-05 13:50

*/@configuration

public

class

beanconfig

}

執行結果:

發現prototype多例模式,每次在呼叫getbean() 獲取例項時,都會重新呼叫 person 類的無參構造方法,重新建立乙個 person 物件。

使用singleton單例,採用餓漢載入(容器啟動,bean例項就建立好了)

使用prototype多例,採用懶漢載入(ioc容器啟動的時候,並不會建立物件例項,而是在第一次使用的時候才會建立)

/**

* todo 主配置類

* * @author : lzb

* @date: 2021-03-05 13:50

*/@configuration

public

class

beanconfig

}

public

class

}

執行結果:

singleton單例模式,在 ioc 容器啟動時,便會去呼叫 person 類的無參構造方法,建立乙個 person 物件。此時並沒有呼叫 getbean() 方法來獲取person 物件例項。所以singleton 採用的是 惡漢式 建立例項物件

注:如何將 singleton 單例模式的惡漢式變更為懶漢式,只需要再新增乙個 @lazy 註解即可。如下所示:

@configuration

public

class

beanconfig

}

/**

* todo 主配置類

* * @author : lzb

* @date: 2021-03-05 13:50

*/@configuration

public

class

beanconfig

}

public

class

}

執行結果:

prototype多例模式,在 ioc 容器啟動時,並不會去建立bean例項,只有在呼叫 getbean() 方法獲取person 物件時,才會去呼叫 person 類的無參構造方法,建立乙個 person 物件。所以 prototype 採用的是 懶漢式 建立例項物件

針對單例項bean的話,容器啟動的時候,bean的物件就建立了,而且容器銷毀的時候,也會呼叫bean的銷毀方法;

針對多例項bean的話,容器啟動的時候,bean是不會被建立的而是在獲取bean的時候被建立,而且bean的銷毀不受ioc容器的管理,是由gc來處理的

針對每乙個bean例項,都會有乙個initmethod() 和 destroymethod() 方法,我們可以在bean 類中自行定義,也可以使用 spring 預設提供的這兩個方法。

public

class

person

public

void

init()

public

void

destroy()

}

@configuration

public

class

beanconfig

}

singleton單例,在ioc容器銷毀時,就會呼叫 destroymethod() 方法來將 bean物件銷毀;prototype多例,它的bean例項物件則不受ioc容器的管理,最終由gc來銷毀。

幾乎90%以上的業務使用singleton單例就可以,所以 spring 預設的型別也是singleton,singleton雖然保證了全域性是乙個例項,對效能有所提高,但是如果例項中有非靜態變數時,會導致執行緒安全問題,共享資源的競爭。

當設定為prototype多例時:每次連線請求,都會生成乙個bean例項,也會導致乙個問題,當請求數越多,效能會降低,因為建立的例項,導致gc頻繁,gc時長增加。

博主寫作不易,加個關注唄

求關注、求點贊,加個關注不迷路 ヾ(◍°∇°◍)ノ゙

我不能保證所寫的內容都正確,但是可以保證不複製、不貼上。保證每一句話、每一行**都是親手敲過的,錯誤也請指出,望輕噴 thanks♪(・ω・)ノ

純css瀑布流布局示例詳細講解

這是我在做公司官網時候遇到的問題,ui設計圖樣式如下 問題分析 首先,看見這個ui設計圖 它呈左右兩列不規則分布,而且也能發現width寬度 heigth高度等都不相同。思路分析 毫無疑問,我們用簡單的div布局 css做的話是可以達到這樣的效果的,只是這樣很low,不靈活,而且需要反覆布局排版,量...

Python檔案的操作示例的詳細講解

檔案的讀寫稱為i o操作。操作原理 py檔案是用直譯器去執行,呼叫os作業系統的資源,去操作磁碟上的檔案。操作流程 在去操作乙個檔案的檔案的時候,首先開啟或者建立乙個檔案,進行讀或者寫。讀 從檔案拿到記憶體當中來 寫 把記憶體的檔案放入檔案中 最後進行關閉資源。內建函式 open 可以建立或者開啟乙...

hash表詳細講解及實現

雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程式中,...