Spring scope屬性詳解

2022-07-24 06:09:10 字數 3101 閱讀 6194

scope用來宣告ioc容器中的物件應該處的限定場景或者說該物件的存活空間,即在ioc容器在 物件進入相應的scope之前,生成並裝配這些物件,在該物件不再處於這些scope的限定之後,容器通常會銷毀這些物件。打個比方吧!我們都是處在社會 (容器)中,如果把中學教師作為乙個類定義,那麼當容器初始化這些類之後,中學教師只能侷限在中學這個場景中,中學,就可以看做中學教師的scope。

可以使用bean的singleton或scope屬性來指定相應物件的scope,其中,scope屬性只能在xsd格式的文件生命中使用,類似於如下**所演示的形式:

dtd:

<

bean

id ="mockobject1"

class

="..."

singleton

="false"

/>

xsd:

<

bean

id ="mockobject1"

class

="..."

scope

="prototype"

/>

注意:這裡的singleton和設計模式裡面的單例模式不一樣,標記為singleton的bean是由容器來保證這種型別的bean在同乙個容器內只存在乙個共享例項,而單例模式則是保證在同乙個classloader中只存在乙個這種型別的例項。

1. singleton

singleton型別的bean定義,在乙個容器中只存在乙個例項,所有對該型別bean的依賴都引用這一單一例項,這就好像每個幼兒園都會有乙個滑梯一樣,這個幼兒園的小朋友共同使用這乙個滑梯,而對於幼兒園容器來說,滑梯就是乙個singleton的bean。

此外,singleton型別的bean定義,從容器啟動,到他第一次被請求而例項化開始,只要容器不銷毀或退出,該型別的bean的單一例項就會一直存活。

通常情況下,如果你不指定bean的scope,singleton便是容器預設的scope,所以,下面三種配置,形式實際上達成的是同樣的效果:

dtd or xsd:

<

bean

id ="mockobject1"

class

="..."

/>

dtd:

<

bean

id ="mockobject1"

class

="..."

singleton

="true"

/>

xsd:

<

bean

id ="mockobject1"

class

="..."

scope

="singleton"

/>

2.prototype

scope為prototype的bean,容器在接受到該型別的物件的請求的時候,會每次都重新 生成乙個新的物件給請求方,雖然這種型別的物件的例項化以及屬性設定等工作都是由容器負責的,但是只要準備完畢,並且物件例項返回給請求方之後,容器就不 在擁有當前物件的引用,請求方需要自己負責當前物件後繼生命週期的管理工作,包括該物件的銷毀。也就是說,容器每次返回請求方該物件的乙個新的例項之後, 就由這個物件「自生自滅」了。

讓我們繼續幼兒園的比喻,我們今天要分蘋果了!將蘋果的bean的scope屬性宣告為 prototype,在每個小朋友領取蘋果的時候,我們都是發乙個新的蘋果給他,發完之後,小朋友愛怎麼吃就怎麼吃,愛什麼時候吃什麼時候吃,但是注意吃 完要把果核扔到垃圾箱哦!對於那些不能共享使用的物件型別,應該將其定義的scope設為prototype,通常,宣告為prototype的的 bean,都是一些有狀態的,比如儲存為每個顧客資訊的物件。

可以用一下方式定義prototype型別的bean:

dtd:

<

bean

id ="mockobject1"

class

="..."

singleton

="false"

/>

xsd:

<

bean

id ="mockobject1"

class

="..."

scope

="prototype"

/>

3.request ,session和global session

request:

<

bean

id ="requestprecessor"

class

="...requestprecessor"

scope

="request"

/>

session:

對於web應用來說,放到session中最普遍的就是使用者的登入資訊,對於這種放到session中的資訊,我們我們可以使用如下形式的制定scope為session:

<

bean

id ="userpreferences"

class

="...userpreferences"

scope

="session"

/>

spring容器會為每個獨立的session建立屬於自己的全新的userpreferences例項,他比request scope的bean會存活更長的時間,其他的方面真是沒什麼區別。

global session:

<

bean

id ="userpreferences"

class

="...userpreferences"

scope

="globalsession"

/>

global session只有應用在基於porlet的web應用程式中才有意義,他對映到porlet的global範圍的session,如果普通的servlet的web 應用中使用了這個scope,容器會把它作為普通的session的scope對待。

Spring Scope的簡單原理

行為singleton 每次呼叫beanfactory.getbean返回相同例項 prototype 每次呼叫beanfactory.getbean返回不同例項 spring不會做任何 如果我們在某個單例物件中注入了乙個prototype例項,在整個單例的生命週期,它是不會變化的,除非我們通過be...

DIV屬性詳解

position 決定 div tag 是如何放置的。relative 意思是div的位置是相對於其他 tag 的,而 absolute 是說 div tag 的位置是相對於它所在的視窗。left 相對於視窗左邊的位置 top 相對於視窗上邊的位置 width div tag 的寬度。所有在 div...

css div屬性詳解

步驟一 分析乙個典型的定義div例子 說明如下 margin是指層的邊框以外留的空白,用於頁邊距或者與其它層製造乙個間距。如果上右下左margin值均為10px,則 為 margin top 10px margin right 10px margin bottom 10px margin left ...