spring原始碼學習之 xml配置檔案標籤自定義

2021-09-22 16:56:52 字數 2774 閱讀 7998

spring框架從2.0版本開始,提供了基於schema風格的xml擴充套件機制,允許開發者擴充套件最基本的spring配置檔案(一 般是classpath下的spring.xml)。試想一下,如果我們直接在spring.xml中加入乙個自定義標籤,會發生什麼呢?spring框架啟動的時候會報錯,因為spring根本不認識我們自定義的& lt;mytag>,這樣對spring.xml的校驗就會失敗,最終結果就是框架不能啟動。有什麼方法,能夠讓spring認識並載入解析我們自 定義的呢?這就是spring提供的xml擴充套件機制。我們可以在spring.xml中加入自己的標籤,之後spring會幫 我們解析並納入自己的管理範圍內,這也就是說我們擴充套件了spring的功能。

bean>

這種方式配置雖然也比較簡單,但是有乙個缺點:使用標籤不夠明顯,不如元素屬性那麼直接。現在我們希望在spring.xml中做如下的配置,就能夠完成資料來源的配置。

這種方式比較直接,配置不容易出錯。如果讓spring能夠解析這個標籤,需要4步。

1、提供乙個xsd檔案,負責對xml的標籤進行校驗

<?xml version="1.0" encoding="utf-8"?>

xsd:extension> xsd:complexcontent> xsd:complextype> xsd:element> xsd:schema>

2、定義乙個beandefinitionparser負責解析xml,並將必要的資訊放入spring中

package net.aty.custom.define;

import net.aty.custom.cfg.datasourceinfo;

import org.springframework.beans.factory.config.beandefinition;

import org.springframework.beans.factory.config.beandefinitionholder;

import org.springframework.beans.factory.support.beandefinitionreaderutils; import org.springframework.beans.factory.support.rootbeandefinition; import org.springframework.beans.factory.xml.beandefinitionparser; import org.springframework.beans.factory.xml.parsercontext; import org.w3c.dom.element; public class datasourcebeandefinitionparser implements beandefinitionparser }

該類的功能:設定相關的beanclass,解析了對應的xsd檔案,並將解析的內容註冊到上下文中,同時返回乙個beandefinition物件 (beandefinition是spring的bean定義,提供了bean部分的操作方法,如issingleton()、islazyinit() 等)。注意:id屬性是乙個預設的屬性,可以不在xsd檔案中描述,但是需要註冊它,否則將無法通過getbean方法獲取標籤定義的bean,也無法被 其他bean引用。

3、定義個namespacehandler,由sping框架的呼叫入口。這也是我們自定義xml解析的入口

package net.aty.custom.define;

import org.springframework.beans.factory.xml.namespacehandlersupport;

public class datasourcenamespacehandlersupport extends namespacehandlersupport }

4、配置schema和handler

spring沒那麼聰明,它無法知道我們在什麼地方定義了哪些擴充套件標籤,這些標籤將被誰解析,怎麼解析。這個過程要我們通過一些配置 檔案來告知spring知道,它們就是spring.handlers和spring.schemas,它們放在meta-inf目錄中。 spring.jar的meta-inf目錄中也有同名的檔案,它們的檔案內容基本上是相似的,而spring在執行過程中,如果發現其他jar檔案的 meta-inf資料夾中包含有這兩個檔案,spring將會合併它們。

spring.handlers內容如下:

spring.schemas內容如下:

http\:
我的工程目錄結構如下圖:

測試工程的spring.xml配置如下:

<?xml version="1.0" encoding="utf-8"?>

xmlns:xsi="-instance" xmlns:aty="" xsi:schemalocation=" /spring-beans-3.1.xsd .xsd"> beans>

測試類**如下:

import net.aty.custom.cfg.datasourceinfo;

測試的工程目錄結構如下:

Spring原始碼之XML解析

資料準備階段 準備的目的是封裝 resource引數,目的是為了考慮到 resource可能存在編碼要求的情況,其次,通過 sax讀取 xml檔案的方式來準備 inputsource物件,最後將引數傳遞到 最核心的實現部分 doloadbeandefinitions inputsource,enco...

Spring原始碼學習

a spring 初始化的時候首先要執行的類為 org.springframework.web.context.contextloaderlistener 或 org.springframework.web.context.contextloaderservlet 接下來看一下在這個方法裡幹了寫什麼...

spring 原始碼學習

springioc 學習 1 依賴查詢 2 依賴注入 spring實現ioc的思路是提供一些配置資訊用來描述類之間的依賴關係,然後由容器去解析這些配置資訊,繼而維護好物件之間的依賴關係,前提是物件之間的依賴關係必須在類中定義好 spring依賴注入的方法 構造方法和setter方法 3 類載入模式 ...