Springframework學習(二)之BeanDefinition註冊

Springframework學習(二)之BeanDefinition註冊

Springframework學習(二)之BeanDefinition註冊

相信到這裡你已經明白BeanDefinition是幹什麼用的吧。說白了就是xml配置文件的另一種表現形式。

注意

需要注意的是Spring不僅可以使用自己的標籤也允許用戶自定義標籤。

eg: spring默認支持的,,

Springframework學習(二)之BeanDefinition註冊

dubbo擴展的Spring標籤比如:

Springframework學習(二)之BeanDefinition註冊

所以本篇文章有兩個重點

①: 清楚xml轉換成BeanDefinition的流程

②: 學會自定義自己的標籤解析器並清楚其流程

xml轉換成BeanDefinition調用流程圖

Springframework學習(二)之BeanDefinition註冊

我們接著昨天的地方開始講,昨天講了①,我們已經把XML轉成了Document。今天我們沿著②的方法深入進去,看看Spring是如何把Document標籤轉換成Bean的(注意哦:有自定義的標籤和Spring自帶標籤)。

Springframework學習(二)之BeanDefinition註冊

我們進入registerBeanDefinitions方法

Springframework學習(二)之BeanDefinition註冊

(方法看起來挺簡潔,4行就完了)但是沒有那麼簡單

解析Document和註冊BeanDefinition的實現都在registerBeanDefinitions方法中

跟進registerBeanDefinitions

Springframework學習(二)之BeanDefinition註冊

doRegisterBeanDefinitions

做一些檢查工作,給開發者提供一點供切入的方法,比如preProcessXml解析前的處理

postProcessXml解析後的處理,可以允許子類來複寫

Springframework學習(二)之BeanDefinition註冊

跟進parseBeanDefinitions:

主要是解析document裡面的標籤

① parseDefaultElement解析Spring自帶的標籤

② parseCustomElement解析用戶自定義的標籤,比如

Springframework學習(二)之BeanDefinition註冊

我們跟進parseCustomElement

根據Xml的命名空間獲取處理器,並根據處理器獲取處理器中用戶自定義的解析器

Springframework學習(二)之BeanDefinition註冊

然後我們進去Handler.parse方法,findParseForElement根據元素找到解析器

Springframework學習(二)之BeanDefinition註冊

parse方法很多接口都實現了他做了什麼事情呢?

①: 根據Document的命名空間獲取處理器NamespaceHandler。為什麼有這一步呢?因為NamespaceHandler包含了每個元素(或者說叫標籤)的解析器,正是這些解析器將這樣的標籤解析成BeanDefinition的。而NamespaceHandler是用map的方式把標籤和解析器保存的

Springframework學習(二)之BeanDefinition註冊

② 當根據命名空間獲取了NamespaceHandler,然後進入其parse方法。我們看到了是如何獲取解析器的了,就是從Map中獲取。

Springframework學習(二)之BeanDefinition註冊

③ 根據BeanDefinitionParser去解析Element最終生成BeanDefinition。我們看到parseInternal方法其實是一個抽象方法,是AbstractSingleBeanDefinitionParser去實現了抽象但是doParse無人實現.

Springframework學習(二)之BeanDefinition註冊

Springframework學習(二)之BeanDefinition註冊

我們發現到最後自定義的標籤解析器,真正幹活的方法是doParse沒人去實現了,相信大家已經想到了,這個方法是留給開發人員使用的,這裡所說的開發不是我們平時業務的開發人員,而是說像開發Dubbo的這些框架的開發人員,因為Spring允許他們很容就能把使用Spring的IOC容器來管理。集成到Spring中來使用。


.到這裡本節就講完了,我們已經知道了Document對象是如何最後通過doParse給解析成BeanDefinition。我們最後看下Dubbo是如何自定義解析器的。

Dubbo是如何自定義解析器的。

Springframework學習(二)之BeanDefinition註冊

當解析到每個標籤的時候,在從NamespaceHandler中拿到其對應的解析器來,解析自己定義的標籤。從而來生成BeanDefinition然後交給Spring來管理的。

Springframework學習(二)之BeanDefinition註冊

Springframework學習(二)之BeanDefinition註冊


分享到:


相關文章: