|
|
在Spring中,從BeanFactory或ApplicationContext取得的實例為 Singleton,預設是每一個Bean別名維持一個實例,對單執行緒的程式來說並不會有什麼問題,但對於多執行緒的程式,您必須注意到執行緒安全,您也可以設定每次取得Bean時都產生一個新的實例,例如: <bean id="helloBean"
class="onlyfun.caterpillar.HelloBean" singleton="false"> singleton屬性預設是true,藉由將其設定為false,每次取得Bean時都會產生一個新的實例。 一個Bean從建立到銷毀,會歷經幾個執行階段,如果是使用BeanFactory來管理Bean的話:
由BeanFactory讀取Bean定義檔,並生成各個Bean實例。
執行相關的Bean屬性依賴注入。
如果Bean類別有實作org.springframework.beans.factory.BeanNameAware介面,則執行它的setBeanName()方法。
如果Bean類別有實作org.springframework.beans.factory.BeanFactoryAware介面,則執行它的setBeanFactory()方法。
如果有任何的BeanPostProcessors實例與Bean實例關聯,則執行BeanPostProcessors實例的processBeforeInitialization()方法。
如果Bean類別有實作org.springframework.beans.factory.InitializingBean,則執行它的afterPropertiesSet()方法。
可以在Bean定義檔使用init-method屬性設定方法名稱,例如:
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean" init-method="initBean"> 如果有以上設定的話,則進行至這個階段時,就會執行initBean()方法。
如果有任何的BeanPostProcessors實例與Bean實例關聯,則執行BeanPostProcessors實例的processaAfterInitialization()方法。
在容器關閉時,如果Bean類別有實作org.springframework.beans.factory.DisposableBean,則執行它的destroy()方法。
在容器關閉時,可以在Bean定義檔使用destroy-method屬性設定方法名稱,例如:
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean" destroy-method="destroyBean"> 如果有以上設定的話,則進行至這個階段時,就會執行destroyBean()方法。 如果是使用ApplicationContext來管理Bean的話,則在執行BeanFactoryAware的setBeanFactory()階段 之後,若Bean有實作org.springframework.context.ApplicationContextAware介面,則執行其 setApplicationContext()方法,接著才繼續進行BeanPostProcessors的 processBeforeInitialization()及之後的流程。 |