Spring IOC 之註冊解析的 BeanDefinition

DefaultBeanDefinitionDocumentReader.processBeanDefinition() 完成 Bean 標籤解析的核心工做:緩存

解析工做分爲三步:併發

  1. 解析默認標籤;
  2. 解析默認標籤後下得自定義標籤;
  3. 註冊解析後的 BeanDefinition。

註冊 BeanDefinition 由 BeanDefinitionReaderUtils.registerBeanDefinition() 完成:ide

  • 首先經過 beanName 註冊 BeanDefinition ,而後再註冊別名 alias
  • BeanDefinition 的註冊由接口 BeanDefinitionRegistry 定義

經過 beanName 註冊this

處理過程以下:code

  • 首先 BeanDefinition 進行校驗,該校驗也是註冊過程當中的最後一次校驗了,主要是對 AbstractBeanDefinition 的 methodOverrides 屬性進行校驗
  • 根據 beanName 從緩存中獲取 BeanDefinition,若是緩存中存在,則根據 allowBeanDefinitionOverriding 標誌來判斷是否容許覆蓋,若是容許則直接覆蓋,不然拋出 BeanDefinitionStoreException 異常
  • 若緩存中沒有指定 beanName 的 BeanDefinition,則判斷當前階段是否已經開始了 Bean 的建立階段(),若是是,則須要對 beanDefinitionMap 進行加鎖控制併發問題,不然直接設置便可。對於 hasBeanCreationStarted() 方法後續作詳細介紹,這裏不過多闡述。
  • 若緩存中存在該 beanName 或者 單利 bean 集合中存在該 beanName,則調用 resetBeanDefinition() 重置 BeanDefinition 緩存。

其實整段代碼的核心就在於 this.beanDefinitionMap.put(beanName, beanDefinition);blog

  • BeanDefinition 的緩存也不是神奇的東西,就是定義 map ,key 爲 beanName,value 爲 BeanDefinition

註冊 alias接口

  • BeanDefinitionRegistry.registerAlias 完成 alias 的註冊
  • 註冊 alias 和註冊 BeanDefinition 的過程差很少。在最好調用了 checkForAliasCircle() 來對別名進行了檢測
相關文章
相關標籤/搜索