自定義標籤源碼分析
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:程序員小新人學習 |