spring源碼閱讀(2/4) - Bean循環引用

關於Bean的循環引用,昨天翻了相關的代碼,確實一頭霧水,看了部分的文章後,說實話,思路大概有點兒理解,但再來看代碼仍然迷茫。沒辦法本身在測試例子裏,寫了個循環引用的例子,而後跟進調試代碼,終於明白了點兒,今天就繼續,把循環引用這個部分好好弄弄清楚。測試

翻了半天的代碼,終於弄清楚了。調試

核心是:好比若是beanA和beanB互相依賴。咱們來過一遍代碼的執行流程get

getBean("beanA")  ->  doGetBean("beanA")  ->  createBean("beanA")  ->  populateProperty("beanPro")  ->  getBean("beanB")  ->  doGetBean("beanB")  ->  createBean("beanB") -> populateProperty("beanPro")  ->  getBean("beanA")  ->  getSingleton("beanA")  -> singletonFactory.getObject("beanA")object

流程相似這樣,先去獲取beanA,沒有那麼就建立,建立須要填充property,填充property時,發現有一個ref類型的引用,那麼就去獲取這個屬性對應的beanB,返回到最開始的調用方法只是此次調用的是獲取beanB,也是沒有那麼就建立,建立須要填充property,填充property時,發現又一個ref類型的引用,那麼就去獲取這個屬性對應的beanA,再次返回到最開始的調用方法,此次調用的仍然是beanA,可是此次去執行getSingleton("beanA")的時候,由於咱們第一次執行getBean("beanA")的時候,已經建立了ObjectFactroy,此次就會從objectFactory裏獲取object,這樣有了beanA,那麼beanB就能夠正常建立了,beanB建立完了,就返回到beanA的屬性填充的調用棧,繼續beanA的建立,最終完成整個流程。循環

這就是一個最簡單的循環依賴的建立過程。引用

相關文章
相關標籤/搜索