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支持五種作用域(其中有三種只能用在基於webSpring 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的時候有效。該作用域僅在基於webSpring 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());
	}
	
}


 

發佈了115 篇原創文章 · 獲贊 34 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章