Spring类解析

2024-06-18

spring类解析

【1】自定义标签解析

与自定义标签解析相关的类:

  • org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser
  • org.springframework.beans.factory.xml.NamespaceHandlerSupport

xsd文件

xsd文件 xml schema的用途

  • 定义一个xml文档中都有什么元素
  • 定义一个xml文档中都会有什么属性
  • 定义某个节点都有什么样的子节点,可以有多少个子节点,子节点的出现顺序
  • 定义元素或者属性的数据类型
  • 定义元素或者属性的默认值或者固定值 xml schema的根元素:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema".  表示数据类型等定义来自w3
targetNamespace="http://www.w3schools.com" 表示文档中要定义的元素来自什么命名空间
xmlns="http://www.w3schools.com" 表示此文档的默认命名空间是什么
elementFormDefault="qualified"表示 要求xml文档的每个元素都要有命名空间指定/>
定义主体部分

</xs:schema>

定义简单元素:

<xs:element 此处表示要定义一个元素
name:"color" 表示要定义元素的名称
type:"xs:string" 表示要定义元素的数据类型
default:"red" 表示定义元素的默认值
fixed="red"/>. 表示要定义元素的默认值,此元素只可以取“red"值
以上定义了一个简单元素,元素实例<color>red</color>

定义一个属性

<xs:attribute
name="birthday" 表示要定义属性的名字
type="xs:date" 表示要定义属性的数据类型
default="2001-01-11" 表示要定义属性的默认值
fixed="2001-01-11" 表示要定义属性的固定值
use="required" /> 表示此属性是否是必须指定的,即如果不指定就不符合Schema,默认没有use="required"属性表示属性可有可无

定义元素或者属性值的限制 1、最大值最小值限制

<xs:element name="age">

<xs:simpleType>

<xs:restriction base="xs:integer">

<xs:minInclusive value="0"/> 大于等于0,<xs: minExclusive>表示最小值但是不包括指定值

 <xs:maxInclusive value="120"/> 小于等于120,<xs: maxExclusive>

</xs:restriction>

</xs:simpleType>

</xs:element>

2、枚举限制,指只能在指定的几个值中取值

 <xs:element name="car" type="carType"/>

<xs:simpleType name="carType">

  <xs:restriction base="xs:string">

    <xs:enumeration value="Audi"/>

    <xs:enumeration value="Golf"/>

    <xs:enumeration value="BMW"/>

  </xs:restriction>

</xs:simpleType>

3.模式(pattern)限制 ,指字符串的格式必须满足制定的匹配模式 4.字符串长度的限制 5. 对于空白字符的限制 如何定义复杂类型. 【参考文档】

使用指示器 关键词

+[1]定义实例类bean,需要注入属性值得对象类

public class UserXtd {

    private String userName;
    private String emailAddress;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }
}

定义解析xml配置文件,往对象注入属性类 UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser

public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
    @Override
    protected Class<?> getBeanClass(Element element) {
        return UserXtd.class;
    }

    @Override
    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
        String name = element.getAttribute("userName");
        String address = element.getAttribute("emailAddress");
        if (StringUtils.hasText(name)) {
            builder.addPropertyValue("userName",name);
        }
        if (StringUtils.hasText(address)) {
            builder.addPropertyValue("emailAddress",address);
        }
    }
}

UserNamespaceHandler extends NamespaceHandlerSupport

public class UserNamespaceHandler extends NamespaceHandlerSupport {


    @Override
    public void init() {
        registerBeanDefinitionParser("myUser", new UserBeanDefinitionParser());
    }
}

创建实体类与xml配置文件关联的文件 resources/META-INF/spring.handlers

http\://www.goldstine.com/schema/user=org.example.parsexml.UserNamespaceHandler

resources/META-INF/spring.schemas

http\://www.goldstine.com/schema/user.xsd=META-INF/xmlparse.xsd

定义配置文件的配置。schema文件 xsd。 resources/META-INF/xmlparse.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.goldstine.com/schema/user"
        elementFormDefault="qualified">

    <element name="myUser">
        <complexType>
            <attribute name="id" type="string"/>
            <attribute name="userName" type="string"/>
            <attribute name="emailAddress" type="string"/>
        </complexType>
    </element>
</schema>

定义配置文件。 XTD-xml.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:myname="http://www.goldstine.com/schema/user"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.goldstine.com/schema/user http://www.goldstine.com/schema/user.xsd
">

    <myname:myUser id="testUserBean" userName="huifer" emailAddress="huifer97@163.com"/>

</beans>

spring 排序 Order