1. 程式人生 > >第三章 3.4 DI之Bean的作用域 --《跟我學Spring》筆記 張開濤

第三章 3.4 DI之Bean的作用域 --《跟我學Spring》筆記 張開濤

Bean的作用域

Spring提供“singleton”和“prototype”兩種基本作用域,

另外提供“request”、“session”、“global session”三種web作用域;Spring還允許使用者定製自己的作用域。

 

基本的作用域

一、singleton  (按照 單例設計模式)

    指“singleton”作用域的Bean只會在每個Spring IoC容器中存在一個例項,而且其完整生命 週期完全由Spring容器管理。對於所有獲取該Bean的操作Spring容器將只返回同一個Bean。

 

GoF單例設計模式指“保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點”,介紹了兩種實現:通過在 類上定義靜態屬性保持該例項和通過登錄檔方式。

 

1)通過在類上定義靜態屬性保持該例項

    一般指一個Java虛擬機器 ClassLoader裝載的類只有一個例項,一般通過類 靜態屬性保持該例項,這樣就造成需要單例的類都需要按照單例設計模式進行編碼;Spring沒采用這種方式,因為 該方式屬於侵入式設計;程式碼樣例如下:

以上定義個了個單例類,首先要私有化類構造器;其次使用InstanceHolder靜態內部類持有單例物件,這樣可以得 到惰性初始化好處;最後提供全域性訪問點getInstance

,使得需要該單例例項的物件能獲取到;我們在此還提供了一 個counter計數器來驗證一個ClassLoader一個例項。具體一個ClassLoader有一個單例例項測試請參考程式碼 “cn.javass.spring.chapter3. SingletonTest”中的“testSingleton”測試方法,裡邊詳細演示了一個 ClassLoader有一個單例例項

 

2) 通過登錄檔方式

 首先將需要單例的例項通過唯一鍵註冊到登錄檔,然後通過鍵來獲取單例,讓我們直接看實 現吧,注意本登錄檔實現了Spring介面“SingletonBeanRegistry”,該介面定義了操作共享的單例物件,Spring 容器實現將實現此介面;所以共享單例物件通過“registerSingleton”方法註冊,通過“getSingleton”方法獲 取,消除了程式設計方式單例,注意在實現中不考慮併發:

____________________________________________________________________________

接下來讓我們看看在Spring中如何配置單例Bean吧,在Spring容器中如果沒指定作用域預設就是“singleton”, 配置方式通過scope屬性配置,具體配置如下:

 

Spring管理單例物件在Spring容器中儲存如圖3-5所示,Spring不僅會快取單例物件,Bean定義也是會快取的,對於惰性初始化的物件是在首次使用時根據Bean定義建立並存放於單例快取池。

    惰性初始化的目的是延遲物件的初始化,直到程式真正使用它,同時確保它只初始化一次

 

二、prototype  (原型設計模式

即原型,指每次向Spring容器請求獲取Bean都返回一個全新的Bean,相對於“singleton”來說 就是不快取Bean,每次都是一個根據Bean定義建立的全新Bean。

GoF原型設計模式,指用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

____________________________________________________________________________

Web應用中的作用域

一、request作用域:表示每個請求需要容器建立一個全新Bean。比如提交表單的資料必須是對每次請求新建一個 Bean來保持這些表單資料,請求結束釋放這些資料。

二、session作用域:表示每個會話需要容器建立一個全新Bean。比如對於每個使用者一般會有一個會話,該使用者的 使用者資訊需要儲存到會話中,此時可以將該Bean配置為web作用域。

三、globalSession:類似於session作用域,只是其用於portlet環境的web應用。如果在非portlet環境將視為 session作用域。配置方式和基本的作用域相同,只是必須要有web環境支援,並配置相應的容器監聽器或攔截器從而能應用這些作 用域,我們會在整合web時講解具體使用,大家只需要知道有這些作用域就可以了。