Spring 实现自定义标签

    科技2022-07-13  129

    自定义标签

    1. 创建spring.schemas文件2. 创建mytags.xsd文件3. spring.xml添加自定义标签4. 创建实体类TagTag5. 创建处理类TagParser6. 映射标签和处理类7. 创建spring.handlers文件8. 测试方法代码下载地址

    1. 创建spring.schemas文件

    -在resources文件夹下创建META-INF目录,创建文件spring.schemas,建立xsd文件映射关系

    http\://www.csdn.com/schema/mytags.xsd=META-INF/mytags.xsd

    2. 创建mytags.xsd文件

    指定namespaceuri,标签名称,属性元素

    3. spring.xml添加自定义标签

    4. 创建实体类TagTag

    需要有参构造方法,因为自定义标签属性ip=“192.168.42.111” port="6379是通过有参构造方法设置的属性,没有这个会报错

    package org.example.tag; import org.springframework.stereotype.Component; @Component public class TagTag { private String ip; private String port; public TagTag() { } //需要有参构造方法,因为自定义标签属性ip="192.168.42.111" port="6379是通过有参构造方法设置的属性,没有这个会报错 public TagTag(String ip, String port) { this.ip = ip; this.port = port; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getPort() { return port; } public void setPort(String port) { this.port = port; } }

    5. 创建处理类TagParser

    只需要继承AbstractSingleBeanDefinitionParser即可,不要实现顶层接口BeanDefinitionParser,这样需要自己重写很多方法,继承AbstractSingleBeanDefinitionParser,可以使用AbstractSingleBeanDefinitionParser已经写好的一些方法,解析标签通过继承的父类来完成。getBeanClass(Element element)是一个空方法,需要自己实现。

    doParse也是空方法,需要自己实现

    重写getBeanClass和doParse方法getBeanClass返回需要注入使用的实体类TagTag.classdoParse将标签内的属性ip和port设置到BeanDefinition对象的ConstructorArgumentValues属性中(即通过构造方法设置属性)

    package org.example.tag; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.w3c.dom.Element; public class TagParser extends AbstractSingleBeanDefinitionParser { @Override protected Class<?> getBeanClass(Element element) { return TagTag.class; } @Override protected void doParse(Element element, BeanDefinitionBuilder builder) { String ip = element.getAttribute("ip"); String port = element.getAttribute("port"); builder.addConstructorArgValue(ip); builder.addConstructorArgValue(Integer.parseInt(port)); } }

    6. 映射标签和处理类

    继承NamespaceHandlerSupport,重写init方法,指定tagTest标签的处理类

    package org.example.tag; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; public class TagsNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { this.registerBeanDefinitionParser("tagTest", new TagParser()); } }

    7. 创建spring.handlers文件

    指定namespaceuri对应的初始化类

    http\://www.csdn.com/schema/mytags=org.example.tag.TagsNamespaceHandler

    8. 测试方法

    查看打印

    代码下载地址

    https://gitee.com/fisher3652/spring.git

    Processed: 0.018, SQL: 8