Spring的自定义标签
Spring为自定义xml标签加载提供了扩展。用户可自定义标签并注册到Spring的bean容器中。实现较为复杂的bean加载解析。
¶技术要点:
- XML、DTD、XSD
¶什么是XML(EXtensible Markup Language)?
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
¶什么是DTD(Document Type Definition)?
- 文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
¶什么是XSD(XML Schema Definition)?
- XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
¶XSD是DTD的继任者
我们认为 XML Schema 很快会在大部分网络应用程序中取代 DTD。理由如下:
- XML Schema 可针对未来的需求进行扩展
- XML Schema 更完善,功能更强大
- XML Schema 基于 XML 编写
- XML Schema 支持数据类型
- XML Schema 支持命名空间
¶自定义Spring标签
¶自定义xsd:
1 |
|
xmlns
:默认命名空间,类似import
targetNamespace
:定义文件内标签所属命名空间,类似package
elementFormDefault
:在XML文档中使用局部元素时,必须使用限定短名作为前缀
¶定义namespace与handler映射关系文件:
Spring解析xml文件时,需要根据节点所在命名空间对应的处理器来解析。Spring默认从resources/META-INF/spring.handlers文件获取映射关系。用户也可自定义映射文件路径。
¶spring.handlers
1 | http\://www.fpy.org/schema/beans/test=com.example.demo.xsd.CustomNamespaceHandler |
¶定义NamespaceHandler,解析自定义标签
继承NamespaceHandlerSupport类,在init()方法中注册自定义标签的解析器,如testBean标签使用TestBeanDefinitionParser进行解析。
TestBeanDefinitionParser实现BeanDefinitionParser接口,在**parse()**方法中添加自定义解析规则,并注册beanDefinition
1 | public class CustomNamespaceHandler extends NamespaceHandlerSupport { |
¶定义自定义标签xsd映射路径
xml文件xsi:schemaLocation定义了命名空间对应的xsd路径,当改路径为http文档时,避免因网络问题导致加载失败,我们可在本地定义namespace和xsd的映射关系。Spring默认从resources/META-INF/spring.schemas文件获取映射关系。用户也可自定义映射文件路径。
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
将http://www.fpy.org/schema/custom_namespace/CustomNamespaceHandlerTests.xsd
映射到本地文件
¶spring.schemas
1 | http\://www.fpy.org/schema/custom_namespace/CustomNamespaceHandlerTests.xsd=custom_namespace/CustomNamespaceHandlerTests.xsd |
¶测试方法
1 | public class CustomNsTests { |