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"?>2、定義乙個beandefinitionparser負責解析xml,並將必要的資訊放入spring中xsd:extension> xsd:complexcontent> xsd:complextype> xsd:element> xsd:schema>
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 類載入模式 ...