轉自:https://fj-sh-chz.iteye.com/blog/1775149
singleton? (默認屬性)?
Spring將Bean放入Spring IOC容器的緩存池中,并將Bean引用返回給調用者,spring IOC繼續對這些Bean進行后續的生命管理。BeanFactory只管理一個共享的實例。所有對這個特定bean的實例請求,都導致返回這個唯一 bean實例的引用。?
即每次拿到的對象都是引用的同一個地址的對象。當一個bean被標識為singleton時候,spring的IOC容器中只會存在一個該bean。?
2.prototype?
Spring將Bean返回給調用者,調用者負責Bean后續生命的管理,Spring不再管理這些Bean的生命周期。?
每次對這個bean的實例請求都會導致一個新的實例的創建。當用戶需要不受其他用戶對象影響的對象或有類似的需求時,這是一個較理想的解決辦法。?
即每次拿到的對象都是引用的不同地址的對象。相當于一個new的操作。清除prototype作用域的對象并釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責?
以下的3種scope都使用的較少,類似于J2EE里面的request和session。在使用SpringMVC是可能會用到。?
3.request?
?request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效,配置實例: request、session、global session使用的時候首先要在初始化web的web.xml中做如下配置:如果你使用的是Servlet 2.4及以上的web容器,那么你僅需要在web應用的XML聲明文件web.xml中增加下述ContextListener即可:?
?<listener>?
?? <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>?
</listener>?
4.session?
?session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效?
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類型來使用?
對于Action來說需要指明scope=”prototype”或singleton=”false”,因為Action是線程不安全的,可能會導致跳轉的頁面錯誤。?
對于帶有數據成員變量的類需要指明scope=”prototype”或singleton=”false”。不然這樣會導致多個線程共用同一個成員變量。?
有狀態的bean都使用Prototype作用域,而對無狀態的bean則應該使用singleton作用域。