DefaultBeanDefinitionDocumentReader.processBeanDefinition()
完成 Bean 標籤解析的核心工做:緩存
解析工做分爲三步:併發
- 解析默認標籤;
- 解析默認標籤後下得自定義標籤;
- 註冊解析後的 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()
來對別名進行了檢測