詳細(xì)解析:http://cmsblogs.com/?p=2658

如上代碼所示,Spring中編程使用IOC容器的過程:
1,獲取資源
2,獲取BeanFactory
3,根據(jù)新建的BeanFactory創(chuàng)建一個(gè)BeanDefinitonReader對(duì)象,該Reader對(duì)象為資源的解析器
4,裝載資源
分為三個(gè)步驟:資源定位,裝載 ,注冊(cè)

doLoadBeanDefinitions(InputSource inputsource,Resource resource)方法執(zhí)行時(shí)序圖如下:

解析 BeanDefinition 的入口在 DefaultBeanDefinitionDocumentReader 的#parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) 方法。該方法會(huì)根據(jù)命令空間來判斷標(biāo)簽是默認(rèn)標(biāo)簽還是自定義標(biāo)簽,其中:
默認(rèn)標(biāo)簽,由 #parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) 方法來實(shí)現(xiàn)
自定義標(biāo)簽,由 BeanDefinitionParserDelegate 的 #parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) 方法來實(shí)現(xiàn)。
在默認(rèn)標(biāo)簽解析中,會(huì)根據(jù)標(biāo)簽名稱的不同進(jìn)行 import、alias、bean、beans 四大標(biāo)簽進(jìn)行處理。其中 bean 標(biāo)簽的解析為核心,它由 processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) 方法實(shí)現(xiàn)。
processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) 方法,開始進(jìn)入解析核心工作,分為三步:
解析默認(rèn)標(biāo)簽的默認(rèn)標(biāo)簽:BeanDefinitionParserDelegate#parseBeanDefinitionElement(Element ele, ...) 方法。該方法會(huì)依次解析 <bean> 標(biāo)簽的屬性、各個(gè)子元素,解析完成后返回一個(gè) GenericBeanDefinition 實(shí)例對(duì)象。
解析默認(rèn)標(biāo)簽下的自定義標(biāo)簽:BeanDefinitionParserDelegate#decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder definitionHolder) 方法。
注冊(cè)解析的 BeanDefinition:BeanDefinitionReaderUtils#registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) 方法。