BeanFactory和ApplicationContext是Spring中兩種很重要的容器,前者提供了最基本的依賴注入的支持,后者在繼承前者的基礎(chǔ)上進(jìn)行了功能的拓展秸妥,增加了事件傳播淑掌,資源訪問顶捷,國際化的支持等功能达椰。同時兩者的生命周期也稍微有些不同翰蠢。
BeanFactory中Bean的生命周期
- 容器尋找Bean的定義信息,并將其實(shí)例化砰碴。
- 使用依賴注入躏筏,Spring按照Bean定義信息配置Bean的所有屬性。
- 如果Bean實(shí)現(xiàn)了BeanNameAware接口呈枉,工廠調(diào)用Bean的setBeanName()方法傳遞Bean的id趁尼。
- 如果實(shí)現(xiàn)了BeanFactoryAware接口,工廠調(diào)用setBeanFactory()方法傳入工廠自身猖辫。
- 如果BeanPostProcessor和Bean關(guān)聯(lián)酥泞,那么它們的postProcessBeforeInitialization()方法將被調(diào)用。(需要手動進(jìn)行注冊?性鳌)
- 如果Bean實(shí)現(xiàn)了InitializingBean接口芝囤,則會回調(diào)該接口的afterPropertiesSet()方法。
- 如果Bean指定了init-method方法辛萍,就會調(diào)用init-method方法悯姊。
- 如果BeanPostProcessor和Bean關(guān)聯(lián),那么它的postProcessAfterInitialization()方法將被調(diào)用贩毕。(需要手動注冊C跣怼)
- 現(xiàn)在Bean已經(jīng)可以使用了。
- scope為singleton的Bean緩存在Spring IOC容器中辉阶。
- scope為prototype的Bean生命周期交給客戶端先壕。
- 銷毀。
- 如果Bean實(shí)現(xiàn)了DisposableBean接口谆甜,destory()方法將會被調(diào)用垃僚。
- 如果配置了destory-method方法,就調(diào)用這個方法规辱。
ApplicationContext中Bean的生命周期
- 容器尋找Bean的定義信息谆棺,并將其實(shí)例化。會對scope為singleton且非懶加載的bean進(jìn)行實(shí)例化
- 使用依賴注入罕袋,Spring按照Bean定義信息配置Bean的所有屬性改淑。
- 如果Bean實(shí)現(xiàn)了BeanNameAware接口,工廠調(diào)用Bean的setBeanName()方法傳遞Bean的id炫贤。
- 如果實(shí)現(xiàn)了BeanFactoryAware接口溅固,工廠調(diào)用setBeanFactory()方法傳入工廠自身付秕。
- 如果實(shí)現(xiàn)了ApplicationContextAware接口兰珍,會調(diào)用該接口的setApplicationContext()方法,傳入該Bean的ApplicationContext询吴,這樣該Bean就獲得了自己所在的ApplicationContext掠河。
- 如果Bean實(shí)現(xiàn)了BeanPostProcessor接口亮元,則調(diào)用postProcessBeforeInitialization()方法。
- 如果Bean實(shí)現(xiàn)了InitializingBean接口唠摹,則會回調(diào)該接口的afterPropertiesSet()方法爆捞。
- 如果Bean制定了init-method方法,就會調(diào)用init-method方法勾拉。
- 如果Bean實(shí)現(xiàn)了BeanPostProcessor接口煮甥,則調(diào)用postProcessAfterInitialization()方法。
- 現(xiàn)在Bean已經(jīng)可以使用了藕赞。
- scope為singleton的Bean緩存在Spring IOC容器中成肘。
- scope為prototype的Bean生命周期交給客戶端。
- 銷毀斧蜕。
- 如果Bean實(shí)現(xiàn)了DisposableBean接口双霍,destory()方法將會被調(diào)用。
- 如果配置了destory-method方法批销,就調(diào)用這個方法洒闸。
兩種容器中的不同之處
- BeanFactory容器中不會調(diào)用ApplicationContext接口的setApplicationContext()方法。
- BeanFactory中BeanPostProcessor接口的postProcessBeforeInitialzation()方法和postProcessAfterInitialization()方法不會自動調(diào)用均芽,必須自己通過代碼手動注冊丘逸。
- BeanFactory容器啟動的時候,不會去實(shí)例化所有Bean,包括所有scope為singleton且非懶加載的Bean也是一樣骡技,而是在調(diào)用的時候去實(shí)例化鸣个。