天天看點

Spring中Bean的5種作用域scope

Bean簡介:

    在Spring中,那些組成你應用程式的主體(backbone)及由Spring IoC容器所管理的對象,被稱之為bean。 簡單地講,bean就是由Spring容器初始化、裝配及管理的對象,除此之外,bean就與應用程式中的其他對象沒有什麼差別了。 而bean定義以及bean互相間的依賴關系将通過配置中繼資料來描述。

Bean的作用域

建立一個bean定義,其實質是用該bean定義對應的類來建立真正執行個體的“配方(recipe)”。把bean定義看成一個配方很有意義,它與class很類似,隻根據一張“處方”就可以建立多個執行個體。

你不僅可以控制注入到對象中的各種依賴和配置值,還可以控制該對象的作用域。這樣你可以靈活選擇所建對象的作用域,而不必在Java Class級定義作用域。Spring Framework支援五種作用域(其中有三種隻能用在基于web的Spring ApplicationContext)。

1、singleton作用域:

Spring的scope的預設值是singleton

Spring 隻會為每一個bean建立一個執行個體,并保持bean的引用.

<bean id="bean的id" class="bean的包名.類名" scope="singleton"/> 或 

<bean id="bean的id" class="bean的包名.類名" singleton="true"/> 

2、prototype作用域:

一個bean定義對應多個對象執行個體。

每一次請求(将其注入到另一個bean中,或執行getBean()方法)都會産生一個新的bean執行個體,相當于new操作.

Spring一旦将Bean執行個體交給(注入)調用者,就不再持有這個bean的引用。就無法再執行bean定義的destroy-method.

清除prototype作用域的bean對象并釋放資源,是調用者的職責。

<bean id="bean的id" class="bean的包名.類名" scope="prototype"/> 或 

<beanid="bean的id" class="bean的包名.類名" singleton="false"/>

3、request作用域:

HTTP request表示該針對每一次HTTP請求都會産生一個新的bean,僅适用于WebApplicationContext環境。

<bean id="bean的id" class="bean的包名.類名" scope="request"/>

4、session作用域:

HTTP session表示該針對每一次HTTP請求都會産生一個新的bean,僅适用于WebApplicationContext環境。

<bean id="bean的id" class="bean的包名.類名" scope="session"/>

5、globalSession作用域:

在一個全局的HTTP Session中,一個bean定義對應一個執行個體。典型情況下,僅在使用portlet context的時候有效。該作用域僅在基于web的Spring ApplicationContext情形下有效。

考慮下面bean定義:

<bean id="bean的id" class="bean的包名.類名" scope="globalSession"/>

6、自定義scope,必須實作ScopeMetadataResolve接口提供的無參數構造器

<beans >
        <context:component-scan base-package="org.example
                   scope-resolver="MyNameScope"></context:component-scan>
</beans>
           

7、scope舉例

可以通過hashCode判讀是否為同一個Bean

@Scope
@Component
public class BeanAnnotation {
	
	public void say(String arg) {
		System.out.println("BeanAnnotation : " + arg);
	}
	
	public void myHashCode() {
		System.out.println("BeanAnnotation : " + this.hashCode());
	}
	
}