核心利用二級和三級緩存
1,一級緩存:用於存放完全初始化好的 bean
2,二級緩存:存放原始的 bean 對象(尚未填充屬性),用於解決循環依賴 */
3,三級級緩存:存放 bean 工廠對象,用於解決循環依賴
循環依賴發生的時機:實例化與填充屬性/方法的過程中
檢測循環依賴的過程如下:
1,A 創建過程中需要 B,於是 A 將自己放到三級緩裏面 ,去實例
2,B 實例化的時候需要 A,於是 B 先查一級緩存,沒有,再查二級緩存,還是沒有,再查三級緩存,找到了!
3,然後把三級緩存裏面的這個 A 放到二級緩存裏面,並刪除三級緩存裏面的 A
4,B 順利初始化完畢,將自己放到一級緩存裏面(此時B裏面的A依然是創建中狀態)
5,然後回來接着創建 A,此時 B 已經創建結束,直接從一級緩存裏面拿到 B ,完成創建,並將自己放到一級緩存裏面
如此一來便解決了循環依賴的問題
單例bean的依賴注入分爲構造器注入和setter方法注入。
1,Spring只會解決setter方法注入的循環依賴,構造器注入的循環依賴會拋BeanCurrentlyInCreationException異常。
2,Spring不會解決prototype作用域的bean,因爲Spring容器不進行緩存"prototype"作用域的bean,因此無法提前暴露一個創建中的bean。如果有循環依賴會拋BeanCurrentlyInCreationException異常。
Spring依賴注入方式
1. 接口注入
2. Setter方法注入
3. 構造方法注入