1. 程式人生 > >Spring之Bean總結(一)

Spring之Bean總結(一)

Bean的定義

bean定義包含所需要的容器要知道以下稱為配置元資料的資訊:
如何建立一個bean
Bean 生命週期的詳細資訊
Bean 依賴關係

Bean的例項化
使用類構造器例項化

<bean id=“orderService" class=“com.meession.service.OrderServiceBean"/>

使用靜態工廠方法例項化

    <bean id=“orderService" class=“com.meession.service.OrderFactory" factory-method="createOrder"
/> public class OrderFactory { public static OrderServiceBean createOrder(){ return new OrderServiceBean(); } }

使用例項工廠方法例項化

     <bean id=“orderServiceFactory" class=“com.meession.service.OrderFactory"/>
     <bean id=“orderService" factory-bean=“orderServiceFactory"
factory-method="createOrder"/> public class OrderFactory { public OrderServiceBean createOrder(){ return new OrderServiceBean();} }

Bean的作用域
當通過Spring容器建立一個Bean例項時,不僅可以完成Bean例項的例項化,還可以為Bean指定特定的作用域。Spring支援如下5種作用域:

singleton:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean將只有一個例項

prototype:原型模式,每次通過容器的getBean方法獲取prototype定義的Bean時,都將產生一個新的Bean例項

request:對於每次HTTP請求,使用request定義的Bean都將產生一個新例項,即每次HTTP請求將會產生不同的Bean例項。只有在Web應用中使用Spring時,該作用域才有效

session:對於每次HTTP Session,使用session定義的Bean豆漿產生一個新例項。同樣只有在Web應用中使用Spring時,該作用域才有效

globalsession:每個全域性的HTTP Session,使用session定義的Bean都將產生一個新例項。典型情況下,僅在使用portlet context的時候有效。同樣只有在Web應用中使用Spring時,該作用域才有效

  其中比較常用的是singleton和prototype兩種作用域。對於singleton作用域的Bean,每次請求該Bean都將獲得相同的例項。容器負責跟蹤Bean例項的狀態,負責維護Bean例項的生命週期行為;如果一個Bean被設定成prototype作用域,程式每次請求該id的Bean,Spring都會新建一個Bean例項,然後返回給程式。在這種情況下,Spring容器僅僅使用new 關鍵字建立Bean例項,一旦建立成功,容器不在跟蹤例項,也不會維護Bean例項的狀態。
  如果不指定Bean的作用域,Spring預設使用singleton作用域。Java在建立Java例項時,需要進行記憶體申請;銷燬例項時,需要完成垃圾回收,這些工作都會導致系統開銷的增加。因此,prototype作用域Bean的建立、銷燬代價比較大。而singleton作用域的Bean例項一旦建立成功,可以重複使用。因此,除非必要,否則儘量避免將Bean被設定成prototype作用域。
  
Bean的生命週期
Spring IOC 容器可以管理 Bean 的生命週期, Spring 允許在 Bean 生命週期的特定點執行定製的任務.
Spring IOC 容器對 Bean 的生命週期進行管理的過程:

通過構造器或工廠方法建立 Bean 例項
為 Bean 的屬性設定值和對其他 Bean 的引用
呼叫 Bean 的初始化方法
Bean 可以使用了
當容器關閉時, 呼叫 Bean 的銷燬方法
在 Bean 的聲明裡設定 init-method 和 destroy-method 屬性, 為 Bean 指定初始化和銷燬方法.

Bean定義的繼承
Spring 允許繼承 bean 的配置, 被繼承的 bean 稱為父 bean. 繼承這個父 Bean 的 Bean 稱為子 Bean。子 Bean 從父 Bean 中繼承配置, 包括 Bean 的屬性配置。子 Bean 也可以覆蓋從父 Bean 繼承過來的配置。
父 Bean 可以作為配置模板, 也可以作為 Bean 例項. 若只想把父 Bean 作為模板, 可以設定 的abstract 屬性為 true, 這樣 Spring 將不會例項化這個 Bean。
注意:並不是 元素裡的所有屬性都會被繼承. 比如: autowire, abstract 等.也可以忽略父 Bean 的 class 屬性, 讓子 Bean 指定自己的類, 而共享相同的屬性配置. 但此時父類abstract 必須設為 true。