spring 5.2 自定义标签(二)


一、自定义实现
  

  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" ?>








  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"?>

    

  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中