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