拓展spring元件之自定義標籤

2021-09-18 04:39:34 字數 2552 閱讀 3519

乾貨點

了解如何基於spring自定義標籤,這是自定義元件的第一步。而最重要的是了解了這個過程後也可以大致了解spring自身部分元件是怎麼相互工作和觸發的,如spring-aop,元件可以通過反調aopnamespacehandler了解大致面貌。

系列文描述

書寫該系列文的初衷是因為最近正在負責乙個元件的開發,於是打算將接觸和學習到的知識寫進部落格裡。這第一篇,記錄基於spring如何自定義標籤。

自定義標籤的作用

自定義標籤可以說是spring為了給類似你我這樣的開發人員擴充套件元件使用的,因為它提供了乙個標準的公共可插拔的介面;目前我們都知道spring非常強大,不過實際上除了spring-core和spring-beans外,其他都是通過自定義標籤擴充套件實現的,其次還有一些開源元件也是,如dubbo等。所以,對於想擴充套件spring元件的小夥伴來說,了解如何自定義標籤和相應的原理是必須走的第一步。

那麼如何自定義標籤

自定義標籤可以簡單分為四個步驟,分別是

下面我將以目前開發元件中的**做例子,從在xml檔案中使用開始一步一步逆推,覆盤整個自定義標籤的過程。

首先,先看下目錄情況

common是我自定義的乙個元件組,其中包含的resource元件便是這次使用了自定義標籤的主體,可以從截圖中看出部分相關檔案的存放位置。

test-demo是為了測試這次元件中的自定義標籤是否有作用而存在,test-demo只是匯入了common元件組而已,再從中呼叫resource元件。好了,目錄結構描述完了,接下來進入正題。

看下xml檔案如何使用自定義標籤

在第4行這裡引入了resource對應的命名空間,spring會從本地掃***.handlers***,從中找到對應的key值和value值,如

spring容器會將key值對應的具體命名空間註冊註冊入容器,至於這個空間註冊器是怎麼樣的,後面再表,繼續描述xml檔案。

在之後,我們可以在**xmlns:schemalocation中找到類似的key&value的配置,這次的配置是告訴spring容器從**查詢xsd檔案,這點可以從第六行找到,對應的xsd檔案位址是:

細心的話不難發現,這是乙個網路位址,是的,確實如此,不過spring的容器卻是先在本地掃.schemas檔案,並且讀取其中的鍵值對關係,從中找到本地的檔案位址,如果找不到,才會從網路中讀取。如spring.schemas檔案:

該檔案以一種鍵值對的形式表明了檔案在本地的位址,那就是***resource.xsd***,之後spring容器便會找到***resource.xsd***檔案做校驗。如

走到這一步就說明配置檔案配置好了,接下來便是如何解析的問題了。也就是上文提到***com.nuofankj.resource.schema.namespacehandler***。

那麼namespacehandler類是什麼樣的

該類擴充套件自namespacehandlersupport,目的是將元件註冊到spring容器中。其中以***schemanames.config_element***為名註冊了乙個類***configdefinitionparser***,***schemanames.config_element***對應的變數就是***config***字串,目的就是為了解析

顯然,***configdefinitionparser***就是作為解析器存在的。

接下來看看該解析器是什麼樣的

該解析器繼承了***abstractbeandefinitionparser***類,並且重寫***parseinternal***方法,其中的引數element攜帶了***resource:config***中的所有配置,我們可以將自身的解析業務放在該函式中。以我自定義的元件為例:

我這邊的業務是將***schemanames.package_element***包下的所有類掃出來並且放入list中儲存,已經讀取出type、suffix等相關配置。

個人**:

自定義元件使用spring底層元件

把spring底層一些元件注入到自定義的bean中 例如 獲得spring ioc容器給當前bean設定的名稱,實現beannameaware介面 獲得特殊符號的解析器,實現embeddedvalueresolveraware介面 aware介面都是繼承aware介面,實現aware介面的類都有乙個...

android ActionBar自定義標題欄

size medium color red b 應用程式窗體顯示狀態操作requestwindowfeature可以設定的值有 b color size 1.window.default features 系統預設狀態,一般不需要指定 2.window.feature context menu 啟用...

vue之自定義元件

在vue專案中怎麼自定義元件呢?在網上都到的都是引用vue.js這種的,原生的vue自定義元件方式如下 1 元件假如為a.vue,和引用它的b.vue在同一級的資料夾下 2 在b.vue中寫入的script內部寫入 import star a from a.vue export default 然後...