Spring bean的作用域

2021-09-26 13:25:30 字數 1583 閱讀 1049

1、單例(singleton):在整個應用中只建立bean的乙個例項,是預設的作用域;

2、原型(prototype):每次注入或者通過spring應用上下文獲取時都會建立乙個新的bean例項;

也可以使用@scope("prototype"),但是使用scope_prototype常量更加安全

3、會話(session):在web應用中,為每個會話建立乙個bean例項;

在web應用中,如果能夠例項化在會話和請求範圍內共享的bean,是很有價值的,比如電子商務應用中,可能會有乙個bean代表使用者的購物車。如果購物車是單例,那將會導致所有的使用者都會向同乙個購物車中新增商品,如果購物車是原型作用域,那麼在應用中某乙個地方往購物車中新增商品,在應用中的另乙個地方就不可用了

為什麼要加proxymode=scopedproxymode.inte***ces屬性呢?如下圖所示:

storeservice是乙個單例的bean,會在spring應用上下文載入的時候建立,當它建立的時候spring會試圖將shoppingcart bean注入到setshoppingcart()方法中,但是shoppingcart bean是會話作用域的,此時並不存在,直到某個使用者進入系統,建立了會話之後才會出現shoppingcart的例項。而且系統中將會有多個shoppingcart例項,因為每個使用者乙個,我們並不想讓spring注入某個固定的shoppingcart例項到storeservice中,我們希望處理業務時使用的例項剛好是當前會話對應的那乙個。spring並不會將實際的shoppingcart bean注入到storeservice中,spring實際會注入乙個shoppingcart bean的**,這個**會暴露與shoppingcart相同的方法,當storeservice呼叫shoppingcart的方法時,**會對其進行懶解析並將呼叫委託給會話作用域內真正的shoppingcart bean。

proxymode屬性被設定成scopedproxymode.inte***ces代表這個**要實現乙個介面,並將呼叫委託給實現bean。如果bean型別是具體類,則proxymode屬性設定為scopedproxymode.target_class。

如果是xml配置,則設定為:

使用aop設定為**模式,和@scoped註解的proxymode屬性功能相同,預設情況下會使用cglib建立目標類的**,如果要求生成基於介面的**,則將proxy-target-class屬性設為false:

4、請求(request):在web應用中,為每個請求建立乙個bean例項。

Spring Bean的作用域

bean的作用域,常用的有兩種,單例singleton 多例prototype 預設情況下,bean都是單例的singleton。在容器初始化的時候就被建立,就這麼乙份。1 單例模式 例如 測試 package com.lynn.spring.test import static org.junit...

Spring bean的作用域

spring框架中,bean 的作用域有如下五種 1.單例 每個spring的ioc容器返回來乙個bean例項 框架預設 2.原型 當每次請求時候都返回來乙個bean例項 3.請求 每個http請求返回來乙個bean例項 4.會話 每個http會話返回來乙個bean例項 5.全域性會話 返回全域性會...

Spring Bean的作用域

在xml檔案中配置bean時,我們可以通過scope為bean配置指定的作用域。bean的作用域分為五種 說明 singleton 單例模式,乙個bean容器中只存在乙個bean例項 prototype 原型模式,每次請求都會產生乙個新的bean例項 request 每次http請求會產生乙個新的b...