關於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的建立,最終完成整個流程。循環
這就是一個最簡單的循環依賴的建立過程。引用