Spring入門07 - Bean生命週期

入門 07 - Bean生命週期 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 在Spring中,從BeanFactory取得的實例爲Singleton,預設是每一個別名維持一個實例,對單執行緒的程序來說並不會有什麼問題,但對於多執行緒的程序,您必須注意到執行緒安全,您也可以設定每次從BeanFactory取得 Bean時,都產生一個新的實例,例如:

<bean id="helloBean" class="onlyfun.caterpillar.HelloBean" singleton="false">


 singleton預設是true,藉由將其設定爲false,每次取得Bean時都會產生一個新的實例。
 BeanFactory 負責Bean的生命週期,包括Bean的生成與銷燬、Bean的創建方式(是否爲singleton)、Bean的屬性設定、依賴關聯的建立等。如果您要在Bean的生命週期的某個階段作一些事情,可以有幾個方式,第一個方式是實作Spring所提供的相關接口,透過實作 org.springframework.beans.factory.InitializingBean、 org.springframework.beans.factory.DisposableBean,您可以在Bean創建與銷燬時作一些事情:

public interface InitializingBean {

    void afterPropertiesSet() throws Exception;

}

 

public interface DisposableBean {

    void destroy() throws Exception;

}


 實作接口使得Spring的特定接口侵入Bean的實作中,這並不是個很好的作法,考慮到Bean的可移植性,您可以考慮統一Bean的初始化與銷燬方法,並在Bean定義檔中宣告在初始化或銷燬Bean時使用這些方法:

<bean id="helloBean" class="onlyfun.caterpillar.HelloBean"

                           init-method="init"

                           destroy-method="destroy">


 在實作Bean時,只要加入這些方法即可,例如:

public class HelloBean {

    public void init() {

        ....

    }  

  

    ....

  

    public void destroy() {

        ....

    }

}


 這樣作的好處是可以不引入任何Spring特定的接口,使得Bean可以輕易的從Spring框架中脫離,只要您所採用的另一個框架可以支持您所自訂的初始化與銷燬方法,Bean就不用任何的修改,然而這個方法事實上還是依賴於容器,容器必須有呼叫這些方法的能力,只是 這些方法的名稱可以由我們自行決定,而不用實現特定的接口。
 除了上面兩種方式,您還可以在Bean的建構函式或setter中作一些類似的初始化動作,這可以使得Bean不依賴於特定接口或容器功能,然而銷燬時的動作就比較麻煩,因爲finalize()執行的時間是由GC決定的,您只能在當中放一些不是實時性需求的銷燬相關動作。

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