spring中bean的作用域

2021-04-20 11:43:09 字數 2445 閱讀 4097

如何使用spring的作用域:這裡的scope就是用來配置spring bean的作用域,它標識bean的作用域。      在spring2.0之前bean只有2種作用域即:singleton(單例)、non-singleton(也稱prototype), spring2.0以後,增加了session、request、global session三種專用於web應用程式上下文的bean。因此,預設情況下spring2.0現在有五種型別的bean。當然,spring2.0對bean的型別的設計進行了重構,並設計出靈活的bean型別支援,理論上可以有無數多種型別的bean,使用者可以根據自己的需要,增加新的bean型別,滿足實際應用需求。

1、singleton作用域當乙個bean的作用域設定為singleton, 那麼spring ioc容器中只會存在乙個共享的bean例項,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。換言之,當把乙個bean定義設定為singleton作用域時,spring ioc容器只會建立該bean定義的唯一例項。這個單一例項會被儲存到單例快取(singleton cache)中,並且所有針對該bean的後續請求和引用都將返回被快取的物件例項,這裡要注意的是singleton作用域和gof設計模式中的單例是完全不同的,單例設計模式表示乙個classloader中只有乙個class存在,而這裡的singleton則表示乙個容器對應乙個bean,也就是說當乙個bean被標識為singleton時候,spring的ioc容器中只會存在乙個該bean。配置例項:或者

2、prototype      prototype作用域部署的bean,每一次請求(將其注入到另乙個bean中,或者以程式的方式呼叫容器的getbean()方法)都會產生乙個新的bean例項,相當乙個new的操作,對於prototype作用域的bean,有一點非常重要,那就是spring不能對乙個prototype bean的整個生命週期負責,容器在初始化、配置、裝飾或者是裝配完乙個prototype例項後,將它交給客戶端,隨後就對該prototype例項不聞不問了。不管何種作用域,容器都會呼叫所有物件的初始化生命週期**方法,而對prototype而言,任何配置好的析構生命週期**方法都將不會被呼叫。清除prototype作用域的物件並釋放任何prototype bean所持有的昂貴資源,都是客戶端**的職責。(讓spring容器釋放被singleton作用域bean占用資源的一種可行方式是,通過使用bean的後置處理器,該處理器持有要被清除的bean的引用。)配置例項:或者

3、request    request表示該針對每一次http請求都會產生乙個新的bean,同時該bean僅在當前http request內有效。request、session、global session使用的時候首先要在web.xml中做如下配置:

如果你使用的是servlet 2.4及以上的web容器,那麼你僅需要在web應用的xml宣告檔案web.xml中增加下述contextlistener即可:

接著既可以配置bean的作用域了:

4、session     session作用域表示該針對每一次http請求都會產生乙個新的bean,同時該bean僅在當前http session內有效,配置例項:配置例項:和request配置例項的前提一樣,配置好web啟動檔案就可以如下配置:

5、global session     global session作用域類似於標準的http session作用域,不過它僅僅在基於portlet的web應用中才有意義。portlet規範定義了全域性session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定於全域性portlet session的生命週期範圍內。如果你在web中使用global session作用域來標識bean,那麼web會自動當成session型別來使用。配置例項:和request配置例項的前提一樣,配置好web啟動檔案就可以如下配置:

6、自定義bean裝配作用域       在spring2.0中作用域是可以任意擴充套件的,你可以自定義作用域,甚至你也可以重新定義已有的作用域(但是你不能覆蓋singleton和prototype),spring的作用域由介面org.springframework.beans.factory.config.scope來定義,自定義自己的作用域只要實現該介面即可,下面給個例項:我們建立乙個執行緒的scope,該scope在表示乙個執行緒中有效,**如下:

publicclass myscope implements scope ... 

}; public object get(string name, objectfactory objectfactory) ... 

return object; 

} public object remove(string name) ...

publicvoid registerdestructioncallback(string name, runnable callback) ...

public string getconversationid() ... 

}

Spring中Bean的作用域

bean作用域 作用域描述 singleton 在每個spring ioc容器中乙個bean定義對應乙個物件例項。整個容器中只有該bean的唯一例項 prototype 乙個bean定義對應多個物件例項。request session global session 因為這樣在配置中的任何錯誤就會即刻...

Spring中bean的作用域

1 singleton作用域 當乙個bean的作用域設定為singleton,spring ioc容器只會建立該bean定義的唯一例項。2 prototype prototype作用域部署的bean,每一次請求都會產生乙個新的bean例項,相當與乙個new的操作。3 request request表...

Spring中bean的作用域

本文以spring4.1.6 為例 初期的spring中bean有兩種 單例 singleton 和 原型 prototype spring 預設bean的scope 是 singleton,對於有狀態的bean 不能重複使用需要設定scope 為prototype 即每次組裝時生成乙個全新的bea...