• Spring Schema扩展机制


    1:概述

    Spring2.0开始,Spring提供XML Schema可扩展机制,用户可以自定义XML Schema文件,并自定义

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

    2:步骤:

    • 创建一个XML Schema文件,描述自定义的合法构建模块,也就是xsd文件。

    • 自定义处理器类,并实现NamespaceHandler接口。

    • 自定义一个或者多个解析器,实现BeanDefinitionParser接口(关键部分)。

    • 注册上面的组建到Spring IOC容器。

    3:示例如下:

    (1):自定义XML Schema文件

    <?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与命名空间必须一致。

    (2):自定义NamespaceHandler

    NamespaceHandler接口只有三个方法

    • 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);
        }
    }
  • 相关阅读:
    C#使用Json.Net遍历Json
    晓晨高效IP提取工具 附源码
    JavaScript原生秒表、计时器
    网盘直链工具 winform版 V1.0
    【架构】RPC 使用 Haproxy、keepalive作为负载均衡
    【架构】Google的大规模集群管理工具Borg
    【Networking】gRPC golang 相关资料
    【Linux】find grep 联合使用 过滤所有子目录、文件
    【Storage】Ubuntu LVM 安装配置
    【Ansible】SSH Error: ssh_exchange_identification: Connection closed by remote host
  • 原文地址:https://www.cnblogs.com/liuenyuan1996/p/11093595.html
Copyright © 2020-2023  润新知