Spring Schema擴展機制

1:概述

Spring2.0開始,Spring提供XML Schema可擴展機制,用戶能夠自定義XML Schema文件,並自定義java

XML Bean解析器,集成到Spring IOC容器中。spring

2:步驟:

  • 建立一個XML Schema文件,描述自定義的合法構建模塊,也就是xsd文件。springboot

  • 自定義處理器類,並實現NamespaceHandler接口。dom

  • 自定義一個或者多個解析器,實現BeanDefinitionParser接口(關鍵部分)。ide

  • 註冊上面的組建到Spring IOC容器。測試

3:示例以下:

(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>

自定義targetNamespacehttp://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 uriHandler類映射關係。

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);
    }
}
相關文章
相關標籤/搜索