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。

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

很多程序員開發,很可能都沒注意Bean竟然有這么多種作用域,其實實際項目一般就前面2種會涉及到,但面試官喜歡問。

Bean的生命周期

我多找幾個比較好的圖,大家對比着理解理解

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

好多接口好多方法啊,來我們分個類

Bean自身的方法:的init-method和destor-method方法

Bean級生命周期接口方法:包含了BeanNameAware、BeanFacotyAware、InitialiZingBean和DisposableBean 接口方法

Spring容器生命周期接口方法:有BeanPostProcessor"后處理器"

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

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源碼

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

ApplicationContextAware源碼

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

BeanPostProcessor源碼 【before/after】

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

InitializingBean源碼

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

DisposableBean源碼

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧

 

 

Spring源碼

面試官:說下spring生命周期 程序員:不會 那你先回去等消息吧