相信到這裡你已經明白BeanDefinition是幹什麼用的吧。說白了就是xml配置文件的另一種表現形式。
注意
需要注意的是Spring不僅可以使用自己的標籤也允許用戶自定義標籤。
eg: spring默認支持的
dubbo擴展的Spring標籤比如:
所以本篇文章有兩個重點
①: 清楚xml轉換成BeanDefinition的流程
②: 學會自定義自己的標籤解析器並清楚其流程
xml轉換成BeanDefinition調用流程圖
我們接著昨天的地方開始講,昨天講了①,我們已經把XML轉成了Document。今天我們沿著②的方法深入進去,看看Spring是如何把Document標籤轉換成Bean的(注意哦:有自定義的標籤和Spring自帶標籤)。
我們進入registerBeanDefinitions方法
(方法看起來挺簡潔,4行就完了)但是沒有那麼簡單
解析Document和註冊BeanDefinition的實現都在registerBeanDefinitions方法中
跟進registerBeanDefinitions
doRegisterBeanDefinitions
做一些檢查工作,給開發者提供一點供切入的方法,比如preProcessXml解析前的處理
postProcessXml解析後的處理,可以允許子類來複寫
跟進parseBeanDefinitions:
主要是解析document裡面的標籤
① parseDefaultElement解析Spring自帶的標籤
② parseCustomElement解析用戶自定義的標籤,比如
我們跟進parseCustomElement
根據Xml的命名空間獲取處理器,並根據處理器獲取處理器中用戶自定義的解析器
然後我們進去Handler.parse方法,findParseForElement根據元素找到解析器
parse方法很多接口都實現了他做了什麼事情呢?
①: 根據Document的命名空間獲取處理器NamespaceHandler。為什麼有這一步呢?因為NamespaceHandler包含了每個元素(或者說叫標籤)的解析器,正是這些解析器將
② 當根據命名空間獲取了NamespaceHandler,然後進入其parse方法。我們看到了是如何獲取解析器的了,就是從Map中獲取。
③ 根據BeanDefinitionParser去解析Element最終生成BeanDefinition。我們看到parseInternal方法其實是一個抽象方法,是AbstractSingleBeanDefinitionParser去實現了抽象但是doParse無人實現.
我們發現到最後自定義的標籤解析器,真正幹活的方法是doParse沒人去實現了,相信大家已經想到了,這個方法是留給開發人員使用的,這裡所說的開發不是我們平時業務的開發人員,而是說像開發Dubbo的這些框架的開發人員,因為Spring允許他們很容就能把使用Spring的IOC容器來管理。集成到Spring中來使用。
.到這裡本節就講完了,我們已經知道了Document對象是如何最後通過doParse給解析成BeanDefinition。我們最後看下Dubbo是如何自定義解析器的。
Dubbo是如何自定義解析器的。
當解析到每個標籤的時候,在從NamespaceHandler中拿到其對應的解析器來,解析自己定義的標籤。從而來生成BeanDefinition然後交給Spring來管理的。
閱讀更多 軟件編程指南 的文章