當前位置:
首頁 > 知識 > 自定義標籤源碼分析

自定義標籤源碼分析

2018年06月24日 17:48:51

閱讀數:12

自定義標籤源碼分析

相信了解了自定義標籤的使用方法後,會對自定義標籤實現過程有一個大概思路。無非是根據對應的bean獲取對應的命名空間,根據命名空間解析對應的處理器,然後根據用戶自定義處理器進行解析。

(1)獲取標籤的命名空間

自定義標籤源碼分析

這裡獲取的節點已經載入了一個xml配置,通過這個方法可以獲取到標籤的命名空間

(2)提取自定義標籤處理器

有了命名空間,就可以進行NamespaceHandler的提取了,繼續之前的parseCustomElement跟蹤,分析NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri),在readerContext初始化的時候其屬性namespaceHandlerResolver已經被初始化為了

DefaultNamespaceHandlerResolver的實例,這裡調用resolve方法其實調用的是DefaultNamespaceHandlerResolver類的方法。

自定義標籤源碼分析

上面的函數闡述了解析自定義NamespaceHandler的過程,在上一節中寫了自定義標籤的使用實例。在這裡我們可以看到,可以從Spring.handlers裡面直接獲取對應關係。

public class MyUserNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("user",new UserBeanDefinitionParser());
}
}

當得到自定義命名空間處理後馬上執行namespaceHandler.init()來進行自定義BeanDefinitionParser的註冊。

註冊後,命名空間處理器就可以根據標籤的不同來調用不同的解析器來解析。那麼,根據上面的函數與之前自定義標籤使用,我們基本可以推斷getHandlerMappings的主要功能就是讀取Spring.handlers配置文件並將配置文件緩存在map中。

自定義標籤源碼分析

藉助了工具PropertiesLoaderUtils對屬性handlerMappingsLocation進行了配置文件的讀取,handlerMappingsLocation被默認初始化為「META-INF/Spring.handlers」。

(3)標籤解析

得到解析及要分析的元素後,Spring就可以將解析工作委託給自定義解析器去解析了,在BeanDefinitionParserDelegate的parseCustomElement方法:

return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));

以之前提到的示例進行分析,此時的handler已經確實被實例化成為了我們自定義的MyNamespaceHandler了,而MyNamespaceHandler也已經完成了初始化工作,但是在我們實現的自定義命名空間處理中並沒有實現parse方法,這個方法是父類中的實現,查看父類NamespaceHandlerSupport中的parse方法

自定義標籤源碼分析

而對於parse方法的處理:

自定義標籤源碼分析

這大部分代碼是用來處理將解析後的將AbstractBeanDefinition轉換為BeanDefinitionHolder並註冊的功能,而真正去做解析的事情委託給了函數parseInternal,

在parseInternal中並不是直接調用自定義的doParse函數,而是進行了一系列的數據準備,包括對beanClass、scope、lazyInit等屬性的準備。

自定義標籤源碼分析

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

基於SSM架構的網路租車系統
Python使用三種方法批量修改記事本文件編碼格式

TAG:程序員小新人學習 |