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());
}
}