Spring2.0開始,Spring提供XML Schema
可擴展機制,用戶能夠自定義XML Schema文件,並自定義java
XML Bean解析器,集成到Spring IOC容器中。spring
建立一個XML Schema
文件,描述自定義的合法構建模塊,也就是xsd文件。springboot
自定義處理器類,並實現NamespaceHandler
接口。dom
自定義一個或者多個解析器,實現BeanDefinitionParser
接口(關鍵部分)。ide
註冊上面的組建到Spring IOC容器。測試
(1):自定義XML Schema文件
ui
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns="http://www.liuenyuan.com/schema/myns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" targetNamespace="http://www.liuenyuan.com/schema/myns" elementFormDefault="qualified"> <xsd:import namespace="http://www.springframework.org/schema/beans"/> <xsd:element name="dateFormat"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="beans:identifiedType"> <xsd:attribute name="pattern" type="xsd:string" use="required"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> </xsd:schema>
自定義targetNamespace
是http://www.liuenyuan.com/schema/myns
,xmlns
與命名空間必須一致。spa
(2):自定義NamespaceHandler
代理
NamespaceHandler
接口只有三個方法code
init()
:在NamespaceHandler
被使用以前調用,完成初始化
parse()
:解析元素
decorate():嵌套元素時候調用
Spring提供一個默認實現類NamespaceHandlerSupport
,注入每一個元素的解析器便可。
用到了代理委託
概念。NamespaceHandlerSupport
能夠註冊任意個BeanDefinitionParser
,負責全部自定義元素編排,實際XML解析工做委託給各個BeanDefinitioParser
負責。
(3):自定義BeanDefinitionParser
BeanDefinitionParser
將被調用,若是NamespapceHandler
遇到元素類型已經有對應註冊的parser(例如上面的handler若是遇到dateformat,DateformatDefinitionParser
會被調用,
解析相應的屬性設置到Bean中)將會被調用。BeanDefinitionParser
負責解析一個頂級元素。
Spring提供AbstractSingleBeanDefinitionParser
處理繁重的解析工做。
getBeanClass():返回元素Class類型
doParse():添加元素屬性或者構造參數
(4):註冊handler和schema
把實現的NamespaceHandler和xsd文件配置到指定的配置文件中。位於META-INF
目錄中。
spring.handlers文件包含xml schema uri
和Handler
類映射關係。
http\://www.liuenyuan.com/schema/myns=\
com.ley.springboot.schema.xml.MynsNamespaceHandler
遇到http\://www.liuenyuan.com/schema/myns
命名空間的時候會交給MynsNamespaceHandler來處理,key部分必須和xsd文件中的targetNamespace
值保持一致
spring.schemas文件包含xml schema xsd
文件命名空間和文件路徑
映射關係。
http\://www.liuenyuan.com/schema/myns.xsd=META-INF/myns.xsd
(5):測試
NamespaceHandler
實現類
public class MynsNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { registerBeanDefinitionParser("dateFormat", new MynsBeanDefinitionParser()); } }
BeaDefinitionParser
實現類
import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.w3c.dom.Element; import java.text.SimpleDateFormat; public class MynsBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { @Override protected Class<?> getBeanClass(Element element) { return SimpleDateFormat.class; } @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { String pattern = element.getAttribute("pattern"); builder.addConstructorArgValue(pattern); } }