Spring提供了可扩展Schema的支持,一般情况下,扩展Spring标签的意义并不大,但是对第三方工具来说,开发自己的标签供开发人员使用还是很有必要的。
首先就是有了语义,再者配置起来也相对方便,会减少一定的配置项。
常见的 Spring 的事物管理(tx:
)、AOP(aop:
),还有淘宝的 Dubbo(dubbo:
) 都有自己的标签库。
依赖
1 | <dependency> |
从 NamespaceHandlerSupport
入手
可以通过 IDE 查看 NamespaceHandlerSupport
的继承关系,常见的如 TxNamespaceHandler
、MvcNamespaceHandler
、AopNamespaceHandler
等都是该类的子类。
这里我们也继承NamespaceHandlerSupport
,该类是一个抽象类,需要实现其中的 init()
方法,该方法是在NamespaceHandler
接口中定义的,注释如下:
1 | public interface NamespaceHandler { |
@see NamespaceHandlerSupport#registerBeanDefinitionParser(String, BeanDefinitionParser)
,实现自己的 PojoNamespaceHandler
,代码如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package xyz.kail.blog.example;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
/**
* Created by kail on 2017/2/11.
*/
public class PojoNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
// pojo 即为 自定义的标签名
registerBeanDefinitionParser("pojo",new PojoBeanParser());
}
}
实现 PojoBeanParser
1 | package xyz.kail.blog.example; |
MySelfVO 对象如下
1 | package xyz.kail.blog.example; |
编写 Scheme
XML Schema 的作用是定义 XML 文档的合法构建模块,是W3C标准。
通俗来讲就是定义了一个XML文件应该有哪些元素、一个元素可以有哪些属性、属性必须是什么值、属性的类型等。
META-INF/kail-pojo.xsd 文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
该xsd 定义了一个 pojo 元素,包含 id
、username
、birthday
三个属性,id
是必填的,username
是字符串类型的,birthday
是日期类型的。
编写完 scheme 文件后,还需要在 META-INF
目录下写入 spring.handlers
和spring.schemas
两个文件,指明标签的实现和 scheme 文件位置,格式如下:
META-INF/spring.handlers
1 | http\://blog.kail.xyz/schema/kail=xyz.kail.blog.example.PojoNamespaceHandler |
META-INF/spring.schemas
1 | http\://blog.kail.xyz/schema/kail/kail-pojo.xsd=META-INF/kail-pojo.xsd |
测试
添加依赖
1 | <dependency> |
测试类
1 | import org.junit.Test; |
applicationContext.xml 文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
PS
本文讲的比较简单,复杂用法可以查看官方文档42. Extensible XML authoring,Scheme 语法可以查看 w3c.cn Schema 教程.
具体编写的时候可以查看 NamespaceHandler
接口的实现,根据其中的init()
方法顺藤摸瓜,查看其他优秀的第三方框架是如何实现的。
使用到未知的标签的时候也可以通过该方法,找到对应标签的实现,了解标签背后的原理。