概念:由Spring容器建立的Bean的生存期被稱爲Bean的做用域。web
Bean中,使用<bean>元素的scope特性來指定一個Bean定義的做用域。session
<bean id=」a」 class=」com.lz.A」 scope=」singleton」 />spa
Bean定義了5種做用域,分別爲singleton(單例)、prototype(原型)、request、session和global session,其中request和session做用域只能在web應用程序中。若是在一個獨立的應用程序中使用他們,將致使Spring沒法啓動。prototype
默認狀況下,由Spring容器建立的全部Bean都是Singleton做用域,也就是說,針對一個Bean定義只建立了一個Bean實例,而且Spring容器能夠在整個應用程序生存期中使用該實例(Spring IoC容器中只會存在一個共享的Bean實例,不管有多少個Bean引用它,始終指向同一對象)。代理
當不一樣的Bean與不一樣的層(控制層、服務層和數據訪問對象層)相對應時,可使用Singleton做用域。此時建立的實例都是無狀態實例,在同一時間服務於不一樣的請求。對象
prototype做用域相似於在Java代碼中使用new操做符建立對象。每當須要在容器中或者經過Bean引用從其餘Bean定義中,又或者經過顯式Bean查找(使用ApplicationContext.getBean()方法)從應用程序代碼中訪問prototype做用域Bean時就會建立他們。ci
每當一個新的web請求(Http請求)到達應用程序時就會建立一個Request做用域Bean,而且在整個請求過程當中使用相同的Bean實例。而對不一樣的web請求(Http請求)則會產生新的Bean,並且該Bean僅在當前Http Request內有效,而其它請求沒法看到當前請求中狀態的變化,噹噹前web請求(Http請求)結束,該Bean實例也將會被銷燬。作用域
在一次Http Session中,容器會返回該Bean的同一實例。而對不一樣的Session請求則會建立新的實例,該bean實例僅在當前Session內有效。get
同Http請求相同,每一次session請求建立新的實例,而不一樣的實例之間不共享屬性,且實例僅在本身的session請求內有效,請求結束,則實例將被銷燬。原型
注意:當定義Request做用域Bean和Session做用域Bean時,必須在<bean>元素中放置<aop:scoped-proxy/>元素做爲一個子元素。該指令可讓Spring容器在運行時動態生成一個擴展自Bean定義類的類,以及建立一個使用該動態生成類的代理對象。
在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。
總結:
做用域名稱 |
做用域定義 |
singleton |
從Bean定義中近建立一個實例。這是默認的做用域 |
prototype |
每一次對Bean定義的訪問(不管是經過其餘Bean定義仍是經過getBean()方法)都會建立一個新的Bean實例。相似於Java中的new操做符 |
request |
在整個web請求過程當中使用相同的Bean實例。每個web請求都會建立一個新的Bean實例。僅適用支持web的ApplicationContexts |
session |
針對一個特定的HTTP會話使用相同的Bean實例。不一樣的HTTP會話建立新的Bean實例。僅適用支持web的ApplicationContexts |
globalSession |
相似於前面介紹的標準HTTP Session做用域(如前所述),僅適用於基於portlet的web應用程序的上下文 |