Spring 实现自定义标签

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.class
  • doParse将标签内的属性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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值