在spring框架中支持五種做用域,分別以下:git
Singleton:在Spring IOC 容器僅存在一個Bean實例,Bean以單例方式存在,這個是默認值
prototype:每次從容器調用bean時,都會返回一個新的實例,也就是每次調用getBean()時都會實例化一個新的bean
request:request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效
session:session做用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效
Global Session:global session做用域相似於標準的HTTP Session做用域,不過它僅僅在基於portlet的web應用中才有意義github
通常咱們是不用自定義做用域的,可是Spring提供了這樣的功能,因此瞭解一下,代碼參考Spring5-Design-Patternsweb
做用域由接口org.springframework.beans.factory.config.Scope
定義,因此咱們須要實現這個接口,這個接口有如下幾個方法spring
而後而後實現這個Scope接口session
而後配置一下這個自定義scope做用域,固然咱們也可使用代碼的方式,經過經常使用的ApplicationContext,如ClassPathXmlApplicationContext等的getBeanFactory()方法就能獲取到對應的BeanFactory對象,而後進行註冊。框架
在CustomScopeConfigurer中主要的屬性有Map<String, Object> scopes,主要的實現方法就是在beanFactory中註冊scope,這裏遍歷map用的是entrySet測試
由於咱們以前用的是ThreadLocal,因此來寫點代碼測試一下.net
日誌輸出:prototype
這裏能夠看到建立的對象Mybean和Mybean2是同一個對象,而另起一個線程建立的對象就不是同一個對象啦。線程
咱們來看看Spring的AbstractRequestAttributesScope類,其中SessionScope和RequestScope繼承該類,能夠看到在remove中刪除的時候,獲取須要傳入getScope()參數,請求的數據來自RequestContextHolder設置的
參考:
git@github.com:PacktPublishing/Spring5-Design-Patterns.git