天天看點

Spring(10)——bean作用範圍(二)—自定義scope

如果使用者覺得Spring内置的幾種Scope不能滿足需求,則可以定制自己的Scope,即實作自己的<code>org.springframework.beans.factory.config.Scope</code>。Scope接口定義了如下幾個方法,詳情請參看Spring的API文檔。

下面來看一下Spring内部Scope為application的定義,即<code>ServletContextScope</code>的定義。

自定義了Scope之後我們得在Spring中進行注冊,好讓Spring能夠對其進行識别,這樣我們才能在進行對應bean定義的時候使用自定義的Scope。自定義Scope的注冊有兩種方式,一種是程式化的,一種是通過XML進行配置的。

我們先來實作一個自定義的Scope供注冊自定義Scope使用。

程式化注冊自定義Scope是通過ConfigurableBeanFactory的registerScope()方法進行的,其對應定義如下,scopeName表示我們需要注冊的scope的名稱,第二個參數Scope表示我們需要注冊的Scope的一個執行個體。

我們可以通過常用的ApplicationContext,如ClassPathXmlApplicationContext等的getBeanFactory()方法就能擷取到對應的ConfigurableBeanFactory對象,然後進行注冊。如:

通過XML配置進行注冊是指通過在Spring的配置檔案中定義一個CustomScopeConfigurer類型的bean,并通過其setScopes()方法注入自定義Scope。如下所示,我們通過XML配置注冊了一個名叫myScope的Scope定義。

之後就可以在定義bean的時候使用我們自己定義的myScope來作為bean定義的Scope了。

在上述配置中我們指定了id為hello的bean定義的scope為自定義的myScope。之後運作如下測試代碼,我們可以看到控制台的輸出過程。我們每從bean容器中擷取一次hello的執行個體,對應MyScope的get()方法就會被調用一次。

(注:本文是基于Spring4.1.0所寫)