spring中scope(作用越)理解


  今天總結了一下spring中作用域scope的用法。在spring中作用域通過配置文件形式的用法如下。

<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>

 一. 在spring 中常用的作用域有單例模式(singleton),和多例模式(prototype)

1.當一個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作用域部署的bean,每一次請求(將其注入到另一個bean中,或者以程序的方式調用容器的 getBean()方 法)都會產生一個新的bean實例,相當與一個new的操作,對於prototype作用域的bean,有一點非常重要,那就是Spring不能對一個 prototype bean的整個生命周期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例后,將它交給客戶端,隨后就對該prototype實例不 聞不問了。不管何種作用域,容器都會調用所有對象的初始化生命周期回調方法,而對prototype而言,任何配置好的析構生命周期回調方法都將不會被調 用。 清除prototype作用域的對象並釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。(讓Spring容器釋放被singleton作用域bean占用資源的一種可行方式是,通過使用 bean的后置處理器,該處理器持有要被清除的bean的引用。)如下圖解。

3.對於springweb來說還存在兩種作用越,request,session,global session。

  request:表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效。

  session:表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效。

  golabl session:

     global session作用域類似於標准的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義。Portlet規范定義了全局Session的概念,它被所有構成某個 portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定於全局portlet Session的生命周期范圍內。如果你在web中使用global session作用域來標識bean,那么web會自動當成session類型來使用。

  總結:對於spring來說最常用的作用域是prototype,singleton.當在項目中不存在多線程共享對象或是不需要對象在單線程安全不受其他線程影響,我們可以選擇singleton,這樣可以節約內存,用法可以用在dao層,數據訪問層,因為在dao層我們一般將並發下訪問交給數據庫連接池來管理,這樣整個項目就、只需要一個連接池來管理,singleton更合適。而對於一些其它對象需要線程安全,也就是在線程中new對象,用singleton可能導致線程安全。或是生命周期很短的對象,我們可以選擇prototype.


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM