1. 程式人生 > >spring 自定義標籤的實現

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方法