面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧
Bean實現了BeanNameAware,Spring會將Bean的ID透傳給setBeanName
java、后端開發、程序員、spring
經常被面試問到的題目之一
面試失敗經歷
面試官:請介紹一下Spring框架中Bean的作用域及生命周期?
程序汪汪:不知道
面試官:你工作好多年了,(嫌棄的眼神)那你可以回去等電話
Spring框架中Bean的5個作用域
singleton單例:是spring默認缺省的,全局只有一個對象。
prototype原型:每次都是新的Bean實例,有狀態的Bean建議用此類型。
request:一次Http請求中,容器返回同一實例Bean,僅在當前Http Request內有效
session:一次Http Session中,容器返回同一實例Bean,僅在當前Session內有效。
global session:一個全局的Http Session中,容器返回同一個實例Bean。
很多程序員開發,很可能都沒注意Bean竟然有這么多種作用域,其實實際項目一般就前面2種會涉及到,但面試官喜歡問。
Bean的生命周期
我多找幾個比較好的圖,大家對比着理解理解
好多接口好多方法啊,來我們分個類
Bean自身的方法:的init-method和destor-method方法
Bean級生命周期接口方法:包含了BeanNameAware、BeanFacotyAware、InitialiZingBean和DisposableBean 接口方法
Spring容器生命周期接口方法:有BeanPostProcessor"后處理器"
bean對象實例化,默認Bean作用域singleton
Spring對bean進行依賴注入
Bean實現了BeanNameAware,Spring會將Bean的ID透傳給setBeanName
Bean實現了BeanFacotryAware或ApplicationContentAware,Spring會調用設置工廠setBeanFatory方法並將BeanFacoty實例透傳進來,或SetApplicationContext方法被調用,Spring將應用上下文引用透傳到Bean里。
Bean實現了BeanPostProcessor(后處理),bean的postProcessBeforeInitialization方法會被執行
Bean實現了InitializingBean,bean的afterPropertiesSet方法 就會被調用初始化方法init
BeanPostProcessor(后處理),執行postProcessAfterInitialization
這時Bean准備就緒,可以執行業務邏輯被服務方調用了,Bean會一直存活在應用上下文中,直到應用上下文被銷毀。
Bean實現DisposableBean,spring將執行destory方法
指定銷毀方法 destroy
實戰開發中Bean很少都去實現上面的全部接口,一般最多init-method、destroy-method
BeanNameAware源碼
BeanFactoryAware源碼
ApplicationContextAware源碼
BeanPostProcessor源碼 【before/after】
InitializingBean源碼
DisposableBean源碼
Spring源碼