做者:韓小彬
連接:https://www.zhihu.com/question/38597960/answer/77600561
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
Spring中Bean生命週期過程:
程序員
1.Spring對Bean進行實例化(至關於程序中的new Xx())post
2.Spring將值和Bean的引用注入進Bean對應的屬性中接口
3.若是Bean實現了BeanNameAware接口,Spring將Bean的ID傳遞給setBeanName()方法
(實現BeanNameAware清主要是爲了經過Bean的引用來得到Bean的ID,通常業務中是不多有用到Bean的ID的)生命週期
4.若是Bean實現了BeanFactoryAware接口,Spring將調用setBeanDactory(BeanFactory bf)方法並把BeanFactory容器實例做爲參數傳入。
(實現BeanFactoryAware 主要目的是爲了獲取Spring容器,如Bean經過Spring容器發佈事件等)事件
5.若是Bean實現了ApplicationContextAwaer接口,Spring容器將調用setApplicationContext(ApplicationContext ctx)方法,把y應用上下文做爲參數傳入.
(做用與BeanFactory相似都是爲了獲取Spring容器,不一樣的是Spring容器在調用setApplicationContext方法時會把它本身做爲setApplicationContext 的參數傳入,而Spring容器在調用setBeanDactory前須要程序員本身指定(注入)setBeanDactory裏的參數BeanFactory )it
6.若是Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessBeforeInitialization(預初始化)方法
(做用是在Bean實例建立成功後對進行加強處理,如對Bean進行修改,增長某個功能)io
7.若是Bean實現了InitializingBean接口,Spring將調用它們的afterPropertiesSet方法,做用與在配置文件中對Bean使用init-method聲明初始化的做用同樣,都是在Bean的所有屬性設置成功後執行的初始化方法。class
(此處能夠用於某些,須要在服務啓動時,執行的方法。親測)容器
8.若是Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessAfterInitialization(後初始化)方法
(做用與6的同樣,只不過6是在Bean初始化前執行的,而這個是在Bean初始化後執行的,時機不一樣 )配置
9.通過以上的工做後,Bean將一直駐留在應用上下文中給應用使用,直到應用上下文被銷燬
10.若是Bean實現了DispostbleBean接口,Spring將調用它的destory方法,做用與在配置文件中對Bean使用destory-method屬性的做用同樣,都是在Bean實例銷燬前執行的方法。
參考:Spring實戰