博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 自定义标签的使用
阅读量:2065 次
发布时间:2019-04-29

本文共 3154 字,大约阅读时间需要 10 分钟。

工程目录:

自定义标签有什么用?
       自定义标签可以说是spring为了给类似你我这样的开发人员扩展组件使用的,因为它提供了一个标准的公共可插拔的接口;目前我们都知道spring非常强大,不过实际上除了spring-core和spring-beans外,其他都是通过自定义标签扩展实现的,其次还有一些开源组件也是,如dubbo等。所以,对于想扩展spring组件的小伙伴来说,了解如何自定义标签和相应的原理是必须走的第一步。

如何自定义标签?

1、编写.schemas文件,通知spring容器我们定义的xsd文件在哪里;
2、编写.xsd文件,定义配置时可以使用的属性限制或者说支持的那些属性配置;
3、编写.handlers 文件,扩展NamespaceHandler命名空间注册器和定义及解析器;
4、在xml文件中使用自定义标签

详细例子说明,工程目录

1.定义bean属性,然后在xsd文件中声明

package com.xqc.redis;public class RedisTag {    private String id;    private String ip;    private Integer port;    private String desc;    public RedisTag(String ip, Integer port, String desc) {        this.ip = ip;        this.port = port;        this.desc = desc;    }    public RedisTag() {    }    public String getIp() {        return ip;    }    public void setIp(String ip) {        this.ip = ip;    }    public Integer getPort() {        return port;    }    public void setPort(Integer port) {        this.port = port;    }    public String getDesc() {        return desc;    }    public void setDesc(String desc) {        this.desc = desc;    }    public RedisTag(String ip, Integer port) {        this.ip = ip;        this.port = port;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }}

xsd文件

2.通过spring.shemas指定xsd文件

http\://www.example.org/schema/xqc.xsd=META-INF/xqc.xsd

类似与key=value的形式,如果找不到会去网络上下载。

3.通过spring.handlers指定自定义标签的解析器入口

http\://www.example.org/schema/xqc=com.xqc.namespace.RedisNamespaceHandler

需要实现NamespaceHandler接口,我们继承的它的实现类NamespaceHandlerSupport

import com.xqc.parse.RedisBeanDefinitionParser;import org.springframework.beans.factory.xml.NamespaceHandlerSupport;public class RedisNamespaceHandler extends NamespaceHandlerSupport {    public void init() {        this.registerBeanDefinitionParser("redis",new RedisBeanDefinitionParser());    }}

在init方法里使用我们自定义的解析器,

4.自定义的解析器需要集成BeanDefinitionParser接口,本例中集成的是它的子接口AbstractSingleBeanDefinitionParser

package com.xqc.parse;import com.xqc.redis.RedisTag;import org.springframework.beans.factory.support.BeanDefinitionBuilder;import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;import org.springframework.beans.factory.xml.ParserContext;import org.w3c.dom.Element;public class RedisBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {    @Override    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {        String ip = element.getAttribute("ip");        String port = element.getAttribute("port");        String desc = element.getAttribute("desc");        builder.addPropertyValue("ip",ip);        builder.addPropertyValue("port",Integer.parseInt(port));        builder.addPropertyValue("desc",desc);    }    @Override    protected Class
getBeanClass(Element element) { return RedisTag.class; }}v

按照上面的步骤,一个简单的自定义解析器就完成了,我们可以把工程打成jar包,然后在其他工程里配置使用,本例中我们就在自己当前的工程中解析使用

在applicationContext.xml中声明

通过容器获取配置

 

遇到的问题总结,按照我们上面的格式如果在bean和xsd中没有声明ID,这样使用

报错
翻译报错信息:

转载地址:http://fswmf.baihongyu.com/

你可能感兴趣的文章
剑指offer 33.第一个只出现一次的字符
查看>>
剑指offer 34.把数组排成最小的数
查看>>
剑指offer 35.数组中只出现一次的数字
查看>>
剑指offer 36.数字在排序数组中出现的次数
查看>>
剑指offer 37.数组中重复的数字
查看>>
剑指offer 38.丑数
查看>>
剑指offer 39.构建乘积数组
查看>>
剑指offer 57. 删除链表中重复的结点
查看>>
剑指offer 58. 链表中环的入口结点
查看>>
剑指offer 59. 把字符串转换成整数
查看>>
剑指offer 60. 不用加减乘除做加法
查看>>
leetcode 热题 Hot 100-3. 合并两个有序链表
查看>>
leetcode 热题 Hot 100-4. 对称二叉树
查看>>
Leetcode C++《热题 Hot 100-12》226.翻转二叉树
查看>>
Leetcode C++《热题 Hot 100-13》234.回文链表
查看>>
Leetcode C++《热题 Hot 100-14》283.移动零
查看>>
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-19》543.二叉树的直径
查看>>