從Spring原始碼知曉其所支援的Bean Scope
眾所周知,在Spring2之前,Bean只是支援兩種Scope:singleton和prototype,也就是單例和多例,但是之後又加入了其他的Bean Scope,現在已經到了Sping5,如下圖:
那它現在到底支援幾種Scope,我們就從我現在用的Spring4版本的原始碼中來獲取。
要找到入口,首先要了解xml中bean標籤的scope屬性,或者@Scope註解,我們就從註解入口,給一個bean新增@Scope註解,會出現下面的提示:
從提示中我們可以看出與Bean Scope相關的兩個類:ConfigurableBeanFactory與WebApplicationContext,它們都是介面,其中Bean Scope可以從這兩個類的原始碼中,很顯然的看出是幾種:
從原始碼中可以看出:除了自定義的Scope,Spring現在的版本自身一共支援6種Bean Scope,分別是ConfigurableBeanFactory介面中的singleton、prototype,以及WebApplicationContext介面中的request、session、globalSession、application。對這幾種Scope一一解釋:
1、singleton:單例模式,每個Spring IoC容器僅有一個單例項,這是Bean所預設的Scope;
2、prototype:多例,這個是說在每次注入的時候回自動建立一個新的bean例項;
3、request:每一次 HTTP 請求都會產生一個新的例項,並且該 bean 僅在當前 HTTP 請求內有效;
4、session:每一次 HTTP 請求都會產生一個新的 bean,同時該 bean 僅在當前 HTTP session 內有效;
5、globalSession:類似於標準的全域性的 HTTP Session 作用域,不過它僅僅在基於 portlet 的 web 應用中才有意義。Portlet 規範定義了全域性 Session 的概念,它被所有構成某個 portlet web 應用的各種不同的 portlet 所共享。在 global session 作用域中定義的 bean 被限定於全域性 portlet Session 的生命週期範圍內。如果你在 web 中使用 global session 作用域來標識 bean,那麼 web 會自動當成 session 型別來使用。
6、application:在一個web應用中只建立一個例項。
後四種Scope和前兩種Scope屬於不同的介面可以看出,當且僅當僅當用戶使用支援 Web 的 ApplicationContext 時,最後四種才可用。之所以註解@Scope提示只出來了四種Scope:singleton、prototype、request、session,是因為globalSession、application這兩種很少用到,甚至request、session都不常用。