上面就是springBean的大致生命周期。
Bean的創建過程
創建Bean之前會調用Bean工廠的后置處理器,可以獲取到BeanDefinition
Bean的初始化過程
初始化之前會調用前置處理器,可以獲取到BeanName和Bean實例
初始化之后會調用后置處理器,也是可以獲取到BeanName和Bean實例,可以做一些屬性的更改等
Bean的初始化也就是注入屬性,這里會涉及到循環依賴的問題。spring默認是開啟循環依賴的。
例如A依賴B,B依賴A
- 當創建A對象的時候,會調用getBeanSington()方法,也就是去單例池中查找有沒有A的Bean,A還沒創建成功,肯定沒有。
- 調用下一個getBeanSington()方法,判斷A對象是否正在被創建,也就是去查找set集合中有沒有A對象,這時候也沒有,然后將A加入set集合中
- 判斷是否支持循環依賴,是否是單例,是的話將A放入singltonFactors也就是第二個map,其實這兒存的是一個工廠,后面就是通過這個工廠獲取對象的
- 開始注入屬性B
- 也是先去單例池中查找有沒有B的Bean,也沒有
- 判斷B對象是否正在被創建,這時候也沒有被創建,將B加入set集合中
- 判斷是否支持循環依賴,是否是單例,是的話放入第二個map中,此時map中已經有A和B
- B也開始注入屬性A
- 去單例池獲取A的Bean,沒有獲取到
- 去set集合中獲取A對象,獲取到了,說明A正在被創建
- 去第二個map中獲取到A的工廠,然后獲取到對象,如果A對象做了代理,就會在這兒進行代理
- B對象注入屬性A完成,如果B對象也做了代理的話,會再初始化完成之后進行AOP
- A對象此時就能從單例池中獲取到B對象
- A對象萬層初始化。