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