我们在使用XML配置AOP、Spring事务或者dubbo的时候,会发现这些配置项的XML标签前面都有一个小小的前缀,如下图所示:
这个小小的前缀称之为xml标签的namespace,用来划定标签的作用域的。像Spring配置文件这样的XML文件,往往是会被多个模块的解析器进行解析的,这些解析器都会定义自己可以解析的标签名称,如果不做任何限定,冲突是在所难免的,引入namespace就可以很好的解决这个问题。比如上图中的aop对应的namespace只会被AOP相关的解析器解析,而不会被别人拿来使用。
确切的讲上图中的[aop]字符串并不是真正的namespace,它只是真正的namespace的一个别名,真正的namespace是在xml的开头被定义的,如下图所示:
上图中的等号左侧的[aop]字符串可以任意修改,等号右侧的字符串则是真正的namespace,是不能进行修改的。如果修改了左侧的[aop]字符串,那么在使用的时候也要进行相应的调整。假设修改为:[aop]->[poa],那么同一个xml就需要修改成如下样子:
如何自定义一个namespace
想要自定一个namespace,并完成相应的标签解析,我们需要完成一下的工作:
- 实现一个BeanDefinitionParser
- 实现一个NamespaceHandler,并为相应的标签注册parser
- 实现一个描述xml格式的xsd文件
- 在META-INF/spring.handlers文件中登记NamespaceHandler
- 在META-INF/spring.schemas中登记xml描述文件
- 在Spring配置文件中使用自定义的namespace
实现一个自定义的namespace
首先定义一个BeanDefinitionParser:
然后定义一个NamespaceHandler:
接着配置一个xml的格式描述文件:
最后在spring.handlers和spring.schemas中配置好:
通过上面几个步骤就完成了一个简单的自定namespace的定义,接下来我们对这个namespace进行测试。
beans.xml文件的内容:
测试类的内容:
测试结果:
通过上面的的内容就完整的展示了如何在Spring中自定义一个XML配置文件的namespace,下一篇文章我将会深入分析Spring中namespace扩展实现的原理。
要知其然,还要知其所以然,方能融会贯通
相关阅读:
Spring AOP是如何从XML中加载的?看了这篇文章你就懂了
对Spring 实现原理感兴趣的朋友可以点下关注,接下来的一段时间我将会从Spring的源代码入手,详细的介绍Spring的实现原理。
本文暂时没有评论,来添加一个吧(●'◡'●)