spring中的scope詳解


1)singleton (單一實例)

 此取值時表明容器中創建時只存在一個實例,所有引用此bean都是單一實例。如同每個國家都有一個總統,國家的所有人共用此總統,而這個國家就是一個spring容器,總統就是spring創建的類的bean,國家中的人就是其它調用者,總統是一個表明其在spring中的scope為singleton,也就是單例模型。

此外,singleton類型的bean定義從容器啟動到第一次被請求而實例化開始,只要容器不銷毀或退出,該類型的bean的單一實例就會一直存活,典型單例模式,如同servlet在web容器中的生命周期。

 

2)prototype

spring容器在進行輸出prototype的bean對象時,會每次都重新生成一個新的對象給請求方,雖然這種類型的對象的實例化以及屬性設置等工作都是由容器負責的,但是只要准備完畢,並且對象實例返回給請求方之后,容器就不在擁有當前對象的引用,請求方需要自己負責當前對象后繼生命周期的管理工作,包括該對象的銷毀。也就是說,容器每次返回請求方該對象的一個新的實例之后,就由這個對象“自生自滅”,最典型的體現就是spring與struts2進行整合時,要把action的scope改為prototype。

如同分蘋果,將蘋果的bean的scope屬性聲明為prototype,在每個人領取蘋果的時候,我們都是發一個新的蘋果給他,發完之后,別人愛怎么吃就怎么吃,愛什么時候吃什么時候吃,但是注意吃完要把蘋果核扔到垃圾箱!對於那些不能共享使用的對象類型,應該將其定義的scope設為prototype。

 

3)request

再次說明request,session和global session類型只實用於web程序,通常是和XmlWebApplicationContext共同使用。

<bean id ="requestPrecessor" class="...RequestPrecessor"   scope="request" />

Spring容器,即XmlWebApplicationContext 會為每個HTTP請求創建一個全新的RequestPrecessor對象,當請求結束后,該對象的生命周期即告結束,如同java web中request的生命周期。當同時有100個HTTP請求進來的時候,容器會分別針對這10個請求創建10個全新的RequestPrecessor實例,且他們相互之間互不干擾,簡單來講,request可以看做prototype的一種特例,除了場景更加具體之外,語意上差不多。

 

4)session

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

<bean id ="userPreferences" class="...UserPreferences"   scope="session" />

Spring容器會為每個獨立的session創建屬於自己的全新的UserPreferences實例,比request scope的bean會存活更長的時間,其他的方面沒區別,如果java web中session的生命周期

 

5)global session

<bean id ="userPreferences" class="...UserPreferences"   scope="globalsession" />

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

 

4.scope配置

 

1)xml方式

進行bean的配置時,指定scope。

2)注解方式

前提為配置spring為注解配置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM