摘要:干貨點(diǎn)了解如何基于自定義標(biāo)簽,這是自定義組件的第一步。這第一篇,記錄基于如何自定義標(biāo)簽。所以,對(duì)于想擴(kuò)展組件的小伙伴來說,了解如何自定義標(biāo)簽和相應(yīng)的原理是必須走的第一步。到這一步,自定義標(biāo)簽的過程就全部理清楚了。
干貨點(diǎn)
了解如何基于spring自定義標(biāo)簽,這是自定義組件的第一步。而最重要的是了解了這個(gè)過程后也可以大致了解spring自身部分組件是怎么相互工作和觸發(fā)的,如spring-aop,組件可以通過反調(diào)AopNamespaceHandler了解大致面貌。
系列文描述書寫該系列文的初衷是因?yàn)樽罱谪?fù)責(zé)一個(gè)組件的開發(fā),于是打算將接觸和學(xué)習(xí)到的知識(shí)寫進(jìn)博客里。這第一篇,記錄基于spring如何自定義標(biāo)簽。
自定義標(biāo)簽的作用自定義標(biāo)簽可以說是spring為了給類似你我這樣的開發(fā)人員擴(kuò)展組件使用的,因?yàn)樗峁┝艘粋€(gè)標(biāo)準(zhǔn)的公共可插拔的接口;目前我們都知道spring非常強(qiáng)大,不過實(shí)際上除了spring-core和spring-beans外,其他都是通過自定義標(biāo)簽擴(kuò)展實(shí)現(xiàn)的,其次還有一些開源組件也是,如dubbo等。所以,對(duì)于想擴(kuò)展spring組件的小伙伴來說,了解如何自定義標(biāo)簽和相應(yīng)的原理是必須走的第一步。
那么如何自定義標(biāo)簽自定義標(biāo)簽可以簡單分為四個(gè)步驟,分別是
編寫.schemas文件,通知spring容器我們定義的xsd文件在哪里;
編寫.xsd文件,定義配置時(shí)可以使用的屬性限制或者說支持的那些屬性配置;
編寫.handlers 文件,擴(kuò)展NamespaceHandler命名空間注冊(cè)器和定義解析器;
在xml文件中使用自定義標(biāo)簽
下面我將以目前開發(fā)組件中的代碼做例子,從在xml文件中使用開始一步一步逆推,復(fù)盤整個(gè)自定義標(biāo)簽的過程。
首先,先看下目錄情況
common是我自定義的一個(gè)組件組,其中包含的resource組件便是這次使用了自定義標(biāo)簽的主體,可以從截圖中看出部分相關(guān)文件的存放位置。
test-demo是為了測(cè)試這次組件中的自定義標(biāo)簽是否有作用而存在,test-demo只是導(dǎo)入了common組件組而已,再從中調(diào)用resource組件。好了,目錄結(jié)構(gòu)描述完了,接下來進(jìn)入正題。
看下xml文件如何使用自定義標(biāo)簽
在第4行這里引入了resource對(duì)應(yīng)的命名空間,spring會(huì)從本地掃.handlers,從中找到對(duì)應(yīng)的Key值和Value值,如
spring容器會(huì)將Key值對(duì)應(yīng)的具體命名空間注冊(cè)注冊(cè)入容器,至于這個(gè)空間注冊(cè)器是怎么樣的,后面再表,繼續(xù)描述xml文件。
在之后,我們可以在xmlns:schemaLocation中找到類似的Key&Value的配置,這次的配置是告訴spring容器從哪里查找XSD文件,這點(diǎn)可以從第六行找到,對(duì)應(yīng)的XSD文件地址是:
http://www.nuofankj.com/resou...
細(xì)心的話不難發(fā)現(xiàn),這是一個(gè)網(wǎng)絡(luò)地址,是的,確實(shí)如此,不過spring的容器卻是先在本地掃.schemas文件,并且讀取其中的鍵值對(duì)關(guān)系,從中找到本地的文件地址,如果找不到,才會(huì)從網(wǎng)絡(luò)中讀取。如spring.schemas文件:
該文件以一種鍵值對(duì)的形式表明了文件在本地的地址,那就是resource.xsd,之后spring容器便會(huì)找到resource.xsd文件做校驗(yàn)。如
眾所周知,XSD文件的作用是定義配置時(shí)可以使用的屬性限制或者說支持那些屬性配置。我們可以直接看applicationContext.xml中的配置
走到這一步就說明配置文件配置好了,接下來便是如何解析的問題了。也就是上文提到com.nuofankj.resource.schema.NamespaceHandler。
那么NamespaceHandler類是什么樣的
該類擴(kuò)展自NamespaceHandlerSupport,目的是將組件注冊(cè)到Spring容器中。其中以SchemaNames.CONFIG_ELEMENT為名注冊(cè)了一個(gè)類ConfigDefinitionParser,SchemaNames.CONFIG_ELEMENT對(duì)應(yīng)的變量就是config字符串,目的就是為了解析
顯然,ConfigDefinitionParser就是作為解析器存在的。
接下來看看該解析器是什么樣的
該解析器繼承了AbstractBeanDefinitionParser類,并且重寫parseInternal方法,其中的參數(shù)element攜帶了resource:config中的所有配置,我們可以將自身的解析業(yè)務(wù)放在該函數(shù)中。以我自定義的組件為例:
我這邊的業(yè)務(wù)是將SchemaNames.PACKAGE_ELEMENT包下的所有類掃出來并且放入list中保存,已經(jīng)讀取出type、suffix等相關(guān)配置。
到這一步,自定義標(biāo)簽的過程就全部理清楚了。
相關(guān)源碼地址:https://github.com/wiatingpub...
Java源碼分析、go語言應(yīng)用、微服務(wù),更多干貨歡迎關(guān)注公眾號(hào):
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74693.html
摘要:容器自動(dòng)完成裝載,默認(rèn)的方式是這部分重點(diǎn)在常用模塊的使用以及的底層實(shí)現(xiàn)原理。 對(duì)于那些想面試高級(jí) Java 崗位的同學(xué)來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對(duì)實(shí)際工作的題目就屬于真正的本事了,熱門技術(shù)的細(xì)節(jié)和難點(diǎn)成為了主要考察的內(nèi)容。 這里說「天方夜譚」并不是說算法沒用,不切實(shí)際,而是想說算法平時(shí)其實(shí)很少用到,甚至面試官都對(duì)自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...
摘要:在介紹自定義標(biāo)簽解析前,先放一張圖幫助大家理解以下是如何從文件中解析并加載的。自定義標(biāo)簽比如的值為根據(jù)獲取到的,獲取對(duì)應(yīng)的對(duì)象。關(guān)于和加載先后順序的問題最后再集合一個(gè)小例子總結(jié)下吧當(dāng)我們先解析了元素時(shí),我們會(huì)遍歷所有已經(jīng)注冊(cè)注冊(cè)表中。 今天我們來談?wù)?Dubbo XML 配置相關(guān)內(nèi)容。關(guān)于這部分內(nèi)容我打算分為以下幾個(gè)部分進(jìn)行介紹: Dubbo XML Spring 自定義 XML 標(biāo)...
摘要:當(dāng)你真正到公司里面從事了幾年開發(fā)之后,你就會(huì)同意我的說法利用找工作,需要的就是項(xiàng)目經(jīng)驗(yàn),項(xiàng)目經(jīng)驗(yàn)就是理解項(xiàng)目開發(fā)的基本過程,理解項(xiàng)目的分析方法,理解項(xiàng)目的設(shè)計(jì)思 Java就是用來做項(xiàng)目的!Java的主要應(yīng)用領(lǐng)域就是企業(yè)級(jí)的項(xiàng)目開發(fā)!要想從事企業(yè)級(jí)的項(xiàng)目開發(fā),你必須掌握如下要點(diǎn): 1、掌握項(xiàng)目開發(fā)的基本步驟 2、具備極強(qiáng)的面向?qū)ο蟮姆治雠c設(shè)計(jì)技巧 3、掌握用例驅(qū)動(dòng)、以架構(gòu)為核心的主流開發(fā)...
摘要:整個(gè)代碼如下組裝默認(rèn)配置的數(shù)據(jù)源,查詢數(shù)據(jù)庫配置開始初始化動(dòng)態(tài)數(shù)據(jù)源數(shù)據(jù)源完畢初始化動(dòng)態(tài)數(shù)據(jù)源共計(jì)條重新加載數(shù)據(jù)源配置總結(jié)以上源碼參考個(gè)人項(xiàng)目基于開發(fā)基于前后分離的開發(fā)平臺(tái)一起來聊聊你們是咋用的吧。 業(yè)務(wù)需求 提供所有微服務(wù)數(shù)據(jù)源的圖形化維護(hù)功能 代碼生成可以根據(jù)選擇的數(shù)據(jù)源加載表等源信息 數(shù)據(jù)源管理要支持動(dòng)態(tài)配置,實(shí)時(shí)生效 附錄效果圖showImg(https://segment...
摘要:整個(gè)代碼如下組裝默認(rèn)配置的數(shù)據(jù)源,查詢數(shù)據(jù)庫配置開始初始化動(dòng)態(tài)數(shù)據(jù)源數(shù)據(jù)源完畢初始化動(dòng)態(tài)數(shù)據(jù)源共計(jì)條重新加載數(shù)據(jù)源配置總結(jié)以上源碼參考個(gè)人項(xiàng)目基于開發(fā)基于前后分離的開發(fā)平臺(tái)一起來聊聊你們是咋用的吧。 業(yè)務(wù)需求 提供所有微服務(wù)數(shù)據(jù)源的圖形化維護(hù)功能 代碼生成可以根據(jù)選擇的數(shù)據(jù)源加載表等源信息 數(shù)據(jù)源管理要支持動(dòng)態(tài)配置,實(shí)時(shí)生效 附錄效果圖showImg(https://segment...
閱讀 1452·2021-11-11 16:54
閱讀 9437·2021-11-02 14:44
閱讀 2387·2021-10-22 09:53
閱讀 3270·2019-08-30 11:18
閱讀 1962·2019-08-29 13:29
閱讀 2017·2019-08-27 10:58
閱讀 1635·2019-08-26 11:38
閱讀 3532·2019-08-26 10:31