天天看點

Spring擷取bean的步驟

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生命周期圖

Spring擷取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增加

////////////

參考資料

繼續閱讀