spring 自定義標籤的實現
在我們進行Spring 框架開發中,估計用到最多的就是bean 標籤吧,其實在Spring中像<mvc/><context/>這類標籤以及在dubbo配置的標籤都是屬於自定義的標籤,標籤的解析,已經由作者就行了解析,我們用就好了,那麼我們今天就進行開發一個自己的標籤,模擬 <mvc:annotation-driven/>
大家都知道
<mvc:annotation-driven/> 這個標籤就是將RequestHandlerMapping Adapter .等類進行了載入註冊到了spring 容器中,
為了讓大家更好的理解,我們看dubbo jar spring webmvc jar 包下的META-INF 目錄:
對就是這三個檔案,需要我們進行配置:
1.xsd :xml 約束檔案,懂XML的就知道,用來約束我們XML 標籤規範的,屬性等 2.spring.handlers. :用來解析我們XML的處理器,後面我會給大家說,你一定懂 3.spring.schemas :裡面是用來標示xsd 的地址的;
我們看dubbo的spring.handlers 檔案:忽略前面的地址,主要是後面的class路徑,會被Spring反射呼叫的
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
為什麼說,它會被反射呼叫呢?咋們穩紮穩打,我們看Spring原始碼--在BeanDefinitionParserDelegate 類中,如果不知道,請看一下我的一篇文章-:
link https://www.cnblogs.com/iscys/p/9756458.html
(1),解析自定義的標籤元素,也就是說,自定義的標籤都會就進入這個方法:
1.
(2),namespaceUrl 就是這個地址,比如解析到你使用了mvc dubbo 標籤了,Spring就會找到這個地址,
(3),通過這個地址,我們其實可以大膽的推測出,這個handler 一定是我們在sprin g.handlers中配置的類的例項化,肯定Spring進行了解析,拿到了
後面的類,是不是呢,我們可以點開handler 獲得的方法:
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
點開方法:
1.這個handlerMappings 其實就是 spring.handlers 的一個集合; 2.BeanUtils例項化 3.呼叫例項化後的init方法
getHandlerMappings 的實現:
(3),我們返回第一步,再執行parse方法,就是我們自己的自定義方法;
------好了,關於Spring 自定義解析其實,Spring 就為我們做了這幾件事情
1.例項化一個 自定義handler ,呼叫init
2.parse 方法呼叫
OK,我們這麼想,Spring為我們的解析將init,方法,parse 方法都寫死了,說明Spring 肯定給我們開發者暴露了介面,供我們實現:
1.關於handler的實現:需要
extends NamespaceHandlerSupport 實現 init() 方法;
在init()方法中需要註冊我們需要解析的標籤內容就像這樣;
2.關於new SpringDefinitionParse() 類需要
implements BeanDefinitionParser 實現 其parse 方法,這個是對標籤的解析;在Spring中的parse 方法就是間接性的呼叫這個parse方法;