羽化登峰

导航

 

一、自定义实现
  

  1)spring.handlers 定义处理类位置

http\://www.huang.com/schema/user=com.handler.MyNamespaceHandler

  2)spring.schemas 定义标签验证XSD位置

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

  3)user.xsd

<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.huang.com/schema/user"
xmlns:tns="http://www.huang.com/schema/user"
elementFormDefault="qualified">
<element name="user">
<complexType>
<attribute name="id" type="string"/><!-- 必须要有,否则无法创建bean-->
<attribute name="name" type="string"/>
<attribute name="address" type="string"/>
</complexType>
</element>
</schema>

  4) user.java

public class User {
    private String name;
    private String address;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}                

  5)MyNamespaceHandler.java 映射处理类

public class MyNamespaceHandler extends NamespaceHandlerSupport {
    public void init() {
       //可以是多个          
        registerBeanDefinitionParser("user",new UserBeanDefinitionParser());
    }
}

  6)UserBeanDefinitionParser.java

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

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

  7)test.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:huang="http://www.huang.com/schema/user"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.huang.com/schema/user
    http://www.huang.com/schema/user.xsd">
    <huang:user id="user" name="huang" address="天庭58栋"/>
</beans>

  8)完成,使用
二、解析过程

  1)在上一章解释了整体创建过程,其中在创建BeanFactory完成,会调用loadBeanDefinitions()
  

  2)创建XmlBeanDefinitionReader类并加载指定路径下的文件text.xml,验证xml格式调用getValidationModeForResource()利用spring.schema和use.xsd完成XSD的验证工作并将xml文件解析成Document对象,调用registerBeanDefinitions()方法将document解析成BeanDefinition对象
  

  3)调用registerBeanDefinitions()创建默认解析器DefaultNamespaceHandlerResolver,只能Beans.xsd中定义的
  

  

  4)如果标签非beans.xsd下的将走delegate.parseCustomElement,调用getNamespaceHandlerResolver().resolve(),自动扫描所有的META-INF/spring.handlers,并匹配到合适的NamespaceHandler
  

  5)在通过"use"找到解析器MyBeanDefinitionParser,开始处理标签将元素放入BeanDefinition中

 

posted on 2022-02-23 17:38  默默攀岩  阅读(47)  评论(0)    收藏  举报