自定义标签解析

当Spring拿到一个元素时首先要做的是根据命名空间进行解析,如果是默认的命名空间,则使用parseDefaultElement方法进行元素解析,否则使用parseCustomElement方法进行解析。

1.自定义标签使用

一般的做法会用原生态的方式去解析定义好的XML文件,然后转化为配置对象。这种方式当然可以解决所有问题,但实现起来比较繁琐,特别是在配置非常复杂的时候,解析工作是一个不得不考虑的负担。Spring提供了可扩展Schema的支持,这是一个不错的折中方案,扩展Spring自定义标签配置大致需要以下几个步骤(前提是要把Spring的Core包加入项目中)。
·创建一个需要扩展的组件。
·定义一个XSD文件描述组件内容。
·创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义。
·创建一个Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器。
·编写Spring.handlers和Spring.schemas文件。

自定义标签的过程:
(1)首先创建一个普通的POJO,这个POJO没有任何特别之处,只是用来接受配置文件。
(2)定义一个XSD文件描述组件内容。
(3)创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义。
(4)创建一个Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器。
(5)编写Spring.handlers和Spring.schemas文件,默认位置是在工程的/META-INF/下,当然,可以通过Spring的扩展或者修改源码的方式改变路径。

到这里,自定义的配置就结束了,而Spring加载自定义的大致流程是遇到自定义标签然后就去Spring.handlers和Spring.schemas中去找对应的handler和XSD,默认位置是/META-INF/下,进而有找到对应的handler以及解析元素的Parser,从而完成了整个自定义元素的解析,也就是说自定义与Spring中默认的标准配置不同在于Spring将自定义标签解析的工作委托给了用户去实现。
(6)创建测试配置文件,在配置文件中引入对应的命名空间以及XSD后,便可以直接使用自定义标签了。
在Spring中自定义标签非常常用,例如我们熟知的事务标签:tx(tx:annotation-driven)。

2.自定义标签解析

自定义标签的解析思路非常的简单,无非是根据对应的bean获取对应的命名空间,根据命名空间解析对应的处理器,然后根据用户自定义的处理器进行解析。
2.1获取标签的命名空间
标签的解析是从命名空间的提起开始的,无论是区分Spring中默认标签和自定义标签还是区分自定义标签中不同标签的处理器都是以标签所提供的命名空间为基础的,而至于如何提取对应元素的命名空间其实并不需要我们亲自去实现,在org.w3c.dom.Node中已经提供了方法供我们直接调用:Node.getNamespaceURI();
2.2提取自定义标签处理器
如果要使用自定义标签,那么其中一项必不可少的操作就是在Spring.handlers文件中配置命名空间与命名空间处理器的映射关系。只有这样,Spring才能根据映射关系找到匹配的处理器,当获取到自定义的NamespaceHandler之后就可以进行处理器初始化并解析了。
2.3标签解析
解析过程中首先是寻找元素对应的解析器,进而调用解析器中的parse方法,其实就是首先获取在MyNameSpaceHandler类中的init方法中注册对应的UserBeanDefinitionParser实例,并调用其parse方法进行进一步解析。

自定义标签处理过程中同样也是按照Spring中默认标签的处理方式进行,包括创建BeanDefinition以及进行相应默认属性的设置,对于这些工作Spring都默默地帮我们实习了,只是暴露出一些接口来供用户实现个性化的业务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值