spring作用域

作用域將對Bean的生命週期和創建方式產生影響.

singleton 在spring IOC容器中僅存在一個Bean實例,Bean以單實例的方式存在.

prototype 每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時,相當於執行new XxxBean()的操作.

request 每次HTTP請求都會創建一個新的Bean,該作用域僅適用於webApplicationContext環境.

session 同一個HTTP session共享一個Bean,不同HTTP session使用不同的Bean,該作用域僅適用於webApplicationContext環境.

globalSession 同一個全局session共享一個Bean,一般用於portlet應用環境,該作用域僅適用於webApplicationContext環境.

在低版本的spring中,由於只有兩個Bean作用域,所以採用singleton=”true|false”的配置方式,spring2.0爲了向後兼容,依舊支持這種配置方式.不過,spring2.0推薦採用新的配置方式:scope=”<作用域類型>”


singleton作用域

spring以容器的方式提供天然的單實例模式功能,任何POJO無須編寫特殊的代碼僅通過配置就可以了.

注意:spring將Bean的默認作用域定爲singleton.

singleton例:

Car Bean聲明爲singleton(因爲默認是singleton,所以可以不顯式指定).

在默認情況下,spring的ApplicationContext容器在啓動時,自動實例化所有singleton的Bean並緩存於容器中.

雖然啓動時會花費一些時間,但帶來兩個好處:首先對Bean提前的實例化操作會及早發現一些潛在的配置問題.

其次Bean以緩存的方式保存,當運行時使用到該Bean時就無須再實例化了,加快了運行效率.如果用戶不希望在容

器啓動時提前實例化singleton的Bean,可以通過lazy-init屬性進行控制:

lazy-init=”true”的Bean在某些情況下依舊會提前實例化:如果該Bean被其它需要提前實例化的Bean引用到,

spring也將忽略延遲實例化的設置.


prototype作用域

採用scope=”prototype”指定非單實例作用域Bean,請看:

boss1,boss2所引用的都是一個獨立的Car實例.

在默認情況下,spring容器在啓動時不實例化prototype的Bean.此外,spring容器將prototype的Bean交給調用

者後,就不再管理它的生命週期.


web應用環境相關的Bean作用域

如果用戶使用spring的webApplicationContext,則可以使用另外3種Bean的作用域:request,session和globalSession.不過

在使用這些作用域之前,首先必須在web容器中進行一些額外的配置,在高版本的web容器中,則可以利用HTTP請求監聽器進行配置:

org.springframework.web.context.request.RequestContextListener

細心的朋友可能有一個疑問:在介紹webApplicationContext初始化時,我們已經通過ContextLoaderListener將web容器與

spring容器整合,爲什麼這裏又要引入一個額外的RequestContextListener以支持Bean的另外3個作用域呢?

在整合spring容器時使用ContextLoaderListener,它實現了ServletContextListener監聽器接口,ServletContextListener

只負責監聽web容器啓動和關閉的事件.而RequestContextListener實現ServletRequestListener監聽器接口,該監聽器監聽

HTTP請求事件,web服務器接收的每一次請求都會通知該監聽器.

spring容器啓動和關閉操作由web容器的啓動和關閉事件觸發,但如果spring容器中的Bean需要request,session,globalsession

作用域的支持,spring容器本身就必須獲得web容器的HTTP請求事件,以HTTP請求的事件”驅動”Bean作用域的控制邏輯.

request作用域

顧名思義,request作用域的Bean對應一個HTTP請求和生命週期,考慮下面的配置:

這樣,每次HTTP請求調用到car Bean時,spring容器創建一個新的Car Bean,請求處理完畢後,銷燬這個Bean.

session作用域

假設將以上car的作用域調整爲session類型:

這樣配置後,car Bean的作用域橫跨整個HTTP session,session中所有HTTP請求都共享同一個Car Bean,當HTTP Session結束後,實例

才被銷燬.

globalSession作用域

下面的配置片斷將car的作用域設置爲了globalSession:

globalSession作用域類似於session作用域,不過僅在portlet的web應用中使用.Portlet規範定義了全局Session概念,它被組成portlet

web應用的所有子portlet共享.如果不在Portlet web應用環境下,globalSession自然等價於session作有域了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章