Spring IOC原理解讀:

Spring IOC原理解讀:

BeanFactory(管理bean的源頭或入口, 核心類:DefaultListableBeanFactory)
BeanDefinition(bean的定義信息,將xml轉爲java信息,每個對象都包含了bean配置的屬性信息)
BeanRegistry(創建bean的地方,類:DefaultSingletonBeanRegistry, 方法:beforeSingletonCreation(beanName))

一、加載容器:beanFactory, applicationContext
1、當new FileSystemXmlApplicationContext的時候,會執行refresh方法。
   通過在父級類中AbstractApplicationContext 創建BeanFactory對象
2、然後加載beanDefinition:通過resource加載xml的一些配置文件轉化爲java對象格式進行管理。

二、初始化及依賴注入:

AbstractApplicationContext在容器加載後,會去實例化所有非延遲加載的單例Bean。在DefaultListableBeanFactory中初始化存於他的list中的beanName,一個個初始化。具體bean的創建步驟:
1、先從DefaultSingletonBeanRegestry中獲取bean(先從一級緩存singletonObject中獲取,如沒有從earlySingletonObject獲取,如  沒有就從singletonFactory獲取如取到就將singtonFactory數據移除,放入到earlySingletonObject)。
2、 當從父級BeanFactory的map中獲取到對象時就返回,如果獲取不了,則順着雙親BeanFactory鏈一直向上找,如果能找到,則返回,還是找不到,就創建,具體創建步驟如下圖。

對Bean的創建最爲核心三個方法解釋如下:

  • createBeanInstance:實例化,其實也就是調用對象的構造方法實例化對象
  • populateBean:填充屬性,這一步主要是對bean的依賴屬性進行注入(@Autowired)
  • initializeBean:執行init-method、InitializingBean, PostBeanProcessor的前置後置處理,註冊bean銷燬的回調接口。

      內部通過AccessController.doPrivileged生成一個Constructor,然後Constructor.newInstance創建了對象。

下圖即爲創建bean的過程,也採用了三級緩存解決了循環依賴。(DefaultSingletonBeanRegistry#getSingleton)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章