Dashboard > OpenSource Project > ... > Spring > 入門 07 - Bean生命週期
OpenSource Project Log In   View a printable version of the current page.
入門 07 - Bean生命週期
Added by 良葛格, last edited by 良葛格 on Nov 10, 2004
Labels: 
(None)

 在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決定的,您只能在當中放一些不是即時性需求的銷毀相關動作。

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators