Spring自定義Bean的做用域scope

在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

https://blog.csdn.net/elim168/article/details/75581670

https://somefuture.iteye.com/blog/2293701

相關文章
相關標籤/搜索