Spring框架从2.0版本开始,支持基于Schema的XML扩展机制,允许开发者自定义XML标签。下面以一个小例子,说明如何实现自定义XML配置,并使Spring将我们自定义的XML解析为bean。
我们首先看一下,希望在Spring的XML配置中,添加的新标签:
命名空间d下的parent和child两个元素,是我们增加的新标签。我们需要一个Schema文档,用来说明自定义标签的各个约束,Spring会用这个Schema文档对XML中的标签进行验证:
在这个Schema文档中,我们定义了parent元素和child元素。parent元素有一个名为name的属性,以及一个child类型的列表。注意,我们为这两个新元素声明了一个名为http://www.longingfuture.com/schema/demo的命名空间。在Spring的XML配置文档中,需要保证这个命名空间的正确。
接下来,我们添加一个NamespaceHandler,来支持对新定义的命名空间元素的解析:
MyNamespaceHandler继承了NamespaceHandlerSupport,并重载了init方法。在init方法中,用registerBeanDefinitionParser方法向Spring注册了一个解析器,当遇到XML配置中的parent元素中,就调用这个解析器进行解析。
MyBeanDefinitorParse继承了AbstractBeanDefinitionParser,并重载parseInternal这个方法。在parseInternal方法中,实现具体的解析逻辑:
完成上述过程后,为了能让Spring知道我们新加入的handler和parser,还需要向Spring进行注册,这需要在classpath下的META-INF文档夹下,新增spring.handlers和spring.schemas两个文档。
在spring.handlers文档中,指明了当遇到自定义的命名空间时需要调用哪个handler:
在spring.schemas文档中,指明了Schema文档的具体包位置:
完成上述后,我们就可以正常的从Spring中获取我们的bean了: