您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“如何使用Spring中的scope配置和@scope注解”,內容詳細,步驟清晰,細節處理妥當,希望這篇“如何使用Spring中的scope配置和@scope注解”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Scope,也稱作用域,在 Spring IoC 容器是指其創建的 Bean 對象相對于其他 Bean 對象的請求可見范圍。
在 Spring IoC 容器中具有以下幾種作用域:
基本作用域(singleton、prototype)
Web 作用域(reqeust、session、globalsession)
自定義作用域。
就必須在配置文件中指明,配置方式如下(以 xml 配置文件為例):
<!-- 具體的作用域需要在 scope 屬性中定義 --> <bean id="XXX" class="com.XXX.XXXXX" scope="XXXX" />
singleton
:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean將只有一個實例
prototype
:原型模式,每次通過容器的getBean方法獲取prototype定義的Bean時,都將產生一個新的Bean實例
request
:對于每次HTTP請求,使用request定義的Bean都將產生一個新實例,即每次HTTP請求將會產生不同的Bean實例。只有在Web應用中使用Spring時,該作用域才有效
session
:對于每次HTTP Session,使用session定義的Bean都將產生一個新實例。同樣只有在Web應用中使用Spring時,該作用域才有效
globalsession
:每個全局的HTTP Session,使用session定義的Bean都將產生一個新實例。典型情況下,僅在使用portlet context的時候有效。同樣只有在Web應用中使用Spring時,該作用域才有效
其中比較常用的是singleton和prototype兩種作用域。
對于singleton作用域的Bean,每次請求該Bean都將獲得相同的實例。容器負責跟蹤Bean實例的狀態,負責維護Bean實例的生命周期行為;如果一個Bean被設置成prototype作用域,程序每次請求該id的Bean,Spring都會新建一個Bean實例,然后返回給程序。在這種情況下,Spring容器僅僅使用new 關鍵字創建Bean實例,一旦創建成功,容器不在跟蹤實例,也不會維護Bean實例的狀態。
如果不指定Bean的作用域,Spring默認使用singleton作用域。Java在創建Java實例時,需要進行內存申請;銷毀實例時,需要完成垃圾回收,這些工作都會導致系統開銷的增加。因此,prototype作用域Bean的創建、銷毀代價比較大。而singleton作用域的Bean實例一旦創建成功,可以重復使用。因此,除非必要,否則盡量避免將Bean被設置成prototype作用域。
@scope完成bean的作用域配置默認是單例模式(singleton)如果需要設置的話可以修改對應值與以上提到的一致例如:@scope(“prototype”)
spring中scope是一個非常關鍵的概念,簡單說就是對象在spring容器(IOC容器)中的生命周期,也可以理解為對象在spring容器中的創建方式。
目前,scope的取值有5種取值:
在Spring 2.0之前,有singleton和prototype兩種;
在Spring 2.0之后,為支持web應用的ApplicationContext,增強另外三種:request,session和global session類型,它們只實用于web程序,通常是和XmlWebApplicationContext共同使用。
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對待。
1)xml方式
進行bean的配置時,指定scope。
2)注解方式
前提為配置spring為注解配置。
讀到這里,這篇“如何使用Spring中的scope配置和@scope注解”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。