欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Spring中的scope配置和@scope注解

 更新時(shí)間:2022年06月13日 10:46:13   作者:羅羅諾亞F  
這篇文章主要介紹了使用Spring中的scope配置和@scope注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Spring的scope配置和@scope注解

Scope,也稱(chēng)作用域,在 Spring IoC 容器是指其創(chuàng)建的 Bean 對(duì)象相對(duì)于其他 Bean 對(duì)象的請(qǐng)求可見(jiàn)范圍。

在 Spring IoC 容器中具有以下幾種作用域:

  • 基本作用域(singleton、prototype)
  • Web 作用域(reqeust、session、globalsession)
  • 自定義作用域。

1. Spring的作用域在裝配Bean

就必須在配置文件中指明,配置方式如下(以 xml 配置文件為例):

<!-- 具體的作用域需要在 scope 屬性中定義 -->
<bean id="XXX" class="com.XXX.XXXXX" scope="XXXX" />
  • singleton:?jiǎn)卫J?,在整個(gè)Spring IoC容器中,使用singleton定義的Bean將只有一個(gè)實(shí)例
  • prototype:原型模式,每次通過(guò)容器的getBean方法獲取prototype定義的Bean時(shí),都將產(chǎn)生一個(gè)新的Bean實(shí)例
  • request:對(duì)于每次HTTP請(qǐng)求,使用request定義的Bean都將產(chǎn)生一個(gè)新實(shí)例,即每次HTTP請(qǐng)求將會(huì)產(chǎn)生不同的Bean實(shí)例。只有在Web應(yīng)用中使用Spring時(shí),該作用域才有效
  • session:對(duì)于每次HTTP Session,使用session定義的Bean都將產(chǎn)生一個(gè)新實(shí)例。同樣只有在Web應(yīng)用中使用Spring時(shí),該作用域才有效
  • globalsession:每個(gè)全局的HTTP Session,使用session定義的Bean都將產(chǎn)生一個(gè)新實(shí)例。典型情況下,僅在使用portlet context的時(shí)候有效。同樣只有在Web應(yīng)用中使用Spring時(shí),該作用域才有效

其中比較常用的是singleton和prototype兩種作用域。

對(duì)于singleton作用域的Bean,每次請(qǐng)求該Bean都將獲得相同的實(shí)例。容器負(fù)責(zé)跟蹤Bean實(shí)例的狀態(tài),負(fù)責(zé)維護(hù)Bean實(shí)例的生命周期行為;如果一個(gè)Bean被設(shè)置成prototype作用域,程序每次請(qǐng)求該id的Bean,Spring都會(huì)新建一個(gè)Bean實(shí)例,然后返回給程序。在這種情況下,Spring容器僅僅使用new 關(guān)鍵字創(chuàng)建Bean實(shí)例,一旦創(chuàng)建成功,容器不在跟蹤實(shí)例,也不會(huì)維護(hù)Bean實(shí)例的狀態(tài)。

如果不指定Bean的作用域,Spring默認(rèn)使用singleton作用域。Java在創(chuàng)建Java實(shí)例時(shí),需要進(jìn)行內(nèi)存申請(qǐng);銷(xiāo)毀實(shí)例時(shí),需要完成垃圾回收,這些工作都會(huì)導(dǎo)致系統(tǒng)開(kāi)銷(xiāo)的增加。因此,prototype作用域Bean的創(chuàng)建、銷(xiāo)毀代價(jià)比較大。而singleton作用域的Bean實(shí)例一旦創(chuàng)建成功,可以重復(fù)使用。因此,除非必要,否則盡量避免將Bean被設(shè)置成prototype作用域。

2. 基于注解開(kāi)發(fā)時(shí)

@scope完成bean的作用域配置默認(rèn)是單例模式(singleton)如果需要設(shè)置的話可以修改對(duì)應(yīng)值與以上提到的一致例如:@scope(“prototype”)

Spring中的scope詳解

思維導(dǎo)圖

1. scope概論

spring中scope是一個(gè)非常關(guān)鍵的概念,簡(jiǎn)單說(shuō)就是對(duì)象在spring容器(IOC容器)中的生命周期,也可以理解為對(duì)象在spring容器中的創(chuàng)建方式。

2. scope歷史及分類(lèi)

目前,scope的取值有5種取值:

在Spring 2.0之前,有singleton和prototype兩種;

在Spring 2.0之后,為支持web應(yīng)用的ApplicationContext,增強(qiáng)另外三種:request,session和global session類(lèi)型,它們只實(shí)用于web程序,通常是和XmlWebApplicationContext共同使用。

3. 單個(gè)scope詳解

1)singleton (單一實(shí)例)

此取值時(shí)表明容器中創(chuàng)建時(shí)只存在一個(gè)實(shí)例,所有引用此bean都是單一實(shí)例。如同每個(gè)國(guó)家都有一個(gè)總統(tǒng),國(guó)家的所有人共用此總統(tǒng),而這個(gè)國(guó)家就是一個(gè)spring容器,總統(tǒng)就是spring創(chuàng)建的類(lèi)的bean,國(guó)家中的人就是其它調(diào)用者,總統(tǒng)是一個(gè)表明其在spring中的scope為singleton,也就是單例模型。

此外,singleton類(lèi)型的bean定義從容器啟動(dòng)到第一次被請(qǐng)求而實(shí)例化開(kāi)始,只要容器不銷(xiāo)毀或退出,該類(lèi)型的bean的單一實(shí)例就會(huì)一直存活,典型單例模式,如同servlet在web容器中的生命周期。

2)prototype

spring容器在進(jìn)行輸出prototype的bean對(duì)象時(shí),會(huì)每次都重新生成一個(gè)新的對(duì)象給請(qǐng)求方,雖然這種類(lèi)型的對(duì)象的實(shí)例化以及屬性設(shè)置等工作都是由容器負(fù)責(zé)的,但是只要準(zhǔn)備完畢,并且對(duì)象實(shí)例返回給請(qǐng)求方之后,容器就不在擁有當(dāng)前對(duì)象的引用,請(qǐng)求方需要自己負(fù)責(zé)當(dāng)前對(duì)象后繼生命周期的管理工作,包括該對(duì)象的銷(xiāo)毀。也就是說(shuō),容器每次返回請(qǐng)求方該對(duì)象的一個(gè)新的實(shí)例之后,就由這個(gè)對(duì)象“自生自滅”,最典型的體現(xiàn)就是spring與struts2進(jìn)行整合時(shí),要把a(bǔ)ction的scope改為prototype。

如同分蘋(píng)果,將蘋(píng)果的bean的scope屬性聲明為prototype,在每個(gè)人領(lǐng)取蘋(píng)果的時(shí)候,我們都是發(fā)一個(gè)新的蘋(píng)果給他,發(fā)完之后,別人愛(ài)怎么吃就怎么吃,愛(ài)什么時(shí)候吃什么時(shí)候吃,但是注意吃完要把蘋(píng)果核扔到垃圾箱!對(duì)于那些不能共享使用的對(duì)象類(lèi)型,應(yīng)該將其定義的scope設(shè)為prototype。

3)request

再次說(shuō)明 request,session和global session類(lèi)型只實(shí)用于 web程序,通常是和XmlWebApplicationContext共同使用。

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

Spring容器,即XmlWebApplicationContext 會(huì)為每個(gè)HTTP請(qǐng)求創(chuàng)建一個(gè)全新的RequestPrecessor對(duì)象,當(dāng)請(qǐng)求結(jié)束后,該對(duì)象的生命周期即告結(jié)束,如同java web中request的生命周期。當(dāng)同時(shí)有100個(gè)HTTP請(qǐng)求進(jìn)來(lái)的時(shí)候,容器會(huì)分別針對(duì)這10個(gè)請(qǐng)求創(chuàng)建10個(gè)全新的RequestPrecessor實(shí)例,且他們相互之間互不干擾,簡(jiǎn)單來(lái)講,request可以看做prototype的一種特例,除了場(chǎng)景更加具體之外,語(yǔ)意上差不多。

4)session

對(duì)于web應(yīng)用來(lái)說(shuō),放到session中最普遍的就是用戶(hù)的登錄信息,對(duì)于這種放到session中的信息,我們可以使用如下形式的制定scope為session:

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

Spring容器會(huì)為每個(gè)獨(dú)立的session創(chuàng)建屬于自己的全新的UserPreferences實(shí)例,比request scope的bean會(huì)存活更長(zhǎng)的時(shí)間,其他的方面沒(méi)區(qū)別,如果java web中session的生命周期。

5)global session

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

global session只有應(yīng)用在基于porlet的web應(yīng)用程序中才有意義,它映射到porlet的global范圍的session,如果普通的servlet的web 應(yīng)用中使用了這個(gè)scope,容器會(huì)把它作為普通的session的scope對(duì)待。

4. scope配置

1)xml方式

進(jìn)行bean的配置時(shí),指定scope。

2)注解方式

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過(guò)程

    vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過(guò)程

    這篇文章主要介紹了vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Monaco?Editor實(shí)現(xiàn)sql和java代碼提示實(shí)現(xiàn)示例

    Monaco?Editor實(shí)現(xiàn)sql和java代碼提示實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Monaco?Editor代碼提示sql和java實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Spring Boot項(xiàng)目搭建的兩種方式

    Spring Boot項(xiàng)目搭建的兩種方式

    springboot簡(jiǎn)單快捷方便的優(yōu)點(diǎn)深受用戶(hù)喜愛(ài),springboot開(kāi)發(fā)環(huán)境搭建過(guò)程是每個(gè)開(kāi)發(fā)者必須要做的工作,今天小編寫(xiě)的一篇教程關(guān)于Spring Boot項(xiàng)目搭建方法,通過(guò)兩種方式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • Java中的共享鎖CountDownLatch及源碼解析

    Java中的共享鎖CountDownLatch及源碼解析

    這篇文章主要介紹了Java中的共享鎖CountDownLatch及源碼解析,CountDownLatch是一種同步輔助工具,允許一個(gè)或多個(gè)線程等待,直到在其它線程中執(zhí)行的一組操作完成;CountDownLatch使用指定的計(jì)數(shù)初始化,需要的朋友可以參考下
    2023-11-11
  • SpringBoot?@Profile的使用

    SpringBoot?@Profile的使用

    本文主要介紹了SpringBoot?@Profile的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 使用Java生成JWT(JSON Web Token)的方法示例

    使用Java生成JWT(JSON Web Token)的方法示例

    在現(xiàn)代應(yīng)用程序中,身份驗(yàn)證和授權(quán)是至關(guān)重要的,JWT是一種簡(jiǎn)單而強(qiáng)大的身份驗(yàn)證和授權(quán)機(jī)制,可以在Web應(yīng)用程序中安全地傳輸用戶(hù)信息,本文主要介紹了使用Java生成JWT的方法示例,感興趣的可以了解一下
    2024-03-03
  • Java數(shù)組高級(jí)算法與Arrays類(lèi)常見(jiàn)操作小結(jié)【排序、查找】

    Java數(shù)組高級(jí)算法與Arrays類(lèi)常見(jiàn)操作小結(jié)【排序、查找】

    這篇文章主要介紹了Java數(shù)組高級(jí)算法與Arrays類(lèi)常見(jiàn)操作,結(jié)合實(shí)例形式總結(jié)分析了Java數(shù)組常見(jiàn)的排序算法、查找算法相關(guān)原理、實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2019-03-03
  • java實(shí)現(xiàn)順時(shí)針打印矩陣

    java實(shí)現(xiàn)順時(shí)針打印矩陣

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)順時(shí)針打印矩陣的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • spring boot 集成 swagger3及配置方法

    spring boot 集成 swagger3及配置方法

    Swagger 3是一種開(kāi)源的API描述工具,它可以幫助開(kāi)發(fā)人員設(shè)計(jì)、構(gòu)建、文檔化和測(cè)試API,這篇文章主要介紹了spring boot 集成 swagger3,需要的朋友可以參考下
    2023-05-05
  • 詳解SpringBoot異常處理流程及原理

    詳解SpringBoot異常處理流程及原理

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot異常處理流程及原理展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論