Spring實戰讀書筆記 高階裝配(2)

2021-09-21 00:25:56 字數 1904 閱讀 5924

單例(singleton):整個應用中,只建立乙個bean的例項(預設)

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

會話(session):在web應用中,為每次會話建立乙個新的bean例項。

請求(request):在web應用中,為每次請求建立要給新的bean例項。

預設是singleton,如果需要使用其他作用域,可以使用@scope註解:

@component

@scope

(configurablebeanfactory.scope_prototype)

//推薦 安全不易出錯

//@scope("prototype")

public

class

notepad

也可以使用xml配置

"notepad"

class

="com.beanconfig.beanscope.notepad"

scope=

"prototype"

>

<

/bean>

會話和請求作用域

例如,在電子商務應用中,有乙個代表購物車的bean,如果是單例的話,那麼將會導致所有的使用者都會向乙個購物車裡新增商品。如果是原型的話,那麼在應用中乙個地方新增商品,在另乙個地方就不能用了。

會話作用域是最合適的。

@component

@scope

proxymode = scopedproxymode.inte***ces)

public

inte***ce

shopingcart

scope_session會告訴spring我為web每個會話建立乙個bean。在當前會話中這個bean其實是單例的。

proxymode屬性

@component

public

class

storeservice

}

storeservice是乙個單例bean,會在spring上下文載入的時候建立。而shopingcart 是會話作用域。在storeservice載入的時候,shopingcart還不存在。只有某個使用者進入系統才會出現。

而且,當系統中有多個shopingcart例項的時候,我們只希望自己會話中的shopingcart例項注入到storeservice中。

怎麼解決的呢?

spring不會將實際的shopingcart注入進去,而是會注入乙個shopingcart bean**。這個**暴露域shopingcart相同的方法。當進行方法呼叫時,**會進行懶解析,並將呼叫委託給會話作用域中真正的shopingcart bean。

那麼proxymode屬性

scopedproxymode.inte***ces表明**要通過介面實現。scopedproxymode.target_class基於類的**。

在xml中宣告作用域

"cart"

class

="com.beanconfig.beanscope.shopingcart" scope=

"session"

>

class

="false"

/>

<

/bean>

預設時cglib建立目標類**。proxy-target-class=「false」基於介面建立**

Spring實戰讀書筆記 高階裝配(1)

當你希望你的bean在特殊條件下才能裝配時,比如在宣告了特定的bean時,或者配置了特定的環境變數的時候。那麼就可以使用 conditional註解,可以用在 bean註解下。比如 configuration public class magicbean public class magiexist...

spring讀書筆記

spring的計畫任務 enablescheduling 配置中加入 scheduling 在方法上配置支援cron表示式定時,fixedrate固定時間。條件註解 conditional 通過實現同乙個介面在配置類裡做判斷 組合註解 restcontroller 相當於 controller和 r...

讀書筆記 《Redis實戰》

常見db對比表,由於未標明各個db的版本,這個 其實並不準確,特別是附加功能欄。名稱型別 資料儲存結構 查詢型別 附加功能 redis 使用記憶體的非關係型資料庫 字串 列表 集合 有序集合 雜湊表 每種資料型別都有專屬指令 批量操作 不完全的事務支援 發布與訂閱 主從複製 持久化 指令碼 memc...