1 處理&問題
2 去chache裡找
3 處理對象A依賴對象B的問題
4 生成bean
4.1 處理方法注入 ------lookup-method
4.2 如果類實作了InstantiationAwareBeanPostProcessor接口就調用其postProcessBeforeInstantiation,如果傳回值不為null就調用postProcessAfterInitialization方法,如果還是不為null就傳回,省略後面的doCreatBean方法(等于短路了後面),如果postProcessBeforeInstantiation傳回的就是null,那就繼續往下走,看doCreateBean
4.3 doCreatBean
4.3.1 處理工廠方法 factory-method
4.3.2 允許Annotation修改bean 例如 @resource
4.3.3 處理循環依賴
4.3.4 調用postProcessAfterInitialization方法,如果傳回false,程式就直接傳回 等于短路後續的操作
4.3.5 處理 @Autowire
4.3.6 屬性注入 @resource
4.3.7 類型轉換 調用InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法 其實就是将字元串轉換為需要的對象如把 字元串"2015-12-12"轉成date型的對象
4.3.8 處理 XXAware接口的實作
4.3.9 處理 postProcessBeforeInitialization
4.3.10 處理 InitializingBean的afterPropertiesSet
4.3.11 處理 custom Init方法
4.3.12 處理 postProcessAfterInitialization
5 存入cache
6 容器關閉時,銷毀對象(僅僅适用于Singleton對象)
其中,4.3.4-4.3.7是屬性注入
4.3.4-4.3.12 都可作為bean的生命周期考慮
看一個網上流傳甚廣的bean生命周期圖
////////////
以下為2016-04-20增加
其實getBean部分,主要可以分為3個部分
1-InstantiationAwareBeanPostProcessor 的短路與設值
2-XXXAware的處理
3-初始化BeanPostProcessor的Before與after,還有中間的init-method方法
而這三個部分都是BeanPostProcessor
InstantiationAwareBeanPostProcessor 實作了BeanPostProcess
對xxxaware的處理是借用的ApplicationContextAwareProcessor,它也實作了BeanPostProcess
以上為2016-04-20增加
////////////
參考資料