在Spring3.0中

在Spring3.0.5这个版本上,<mvc:annotation-driven/>声明是没有 defaultAnnotationHandlerMapping这个属性的,对于@ResultMapping标签的解析,是写死了必须用 "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping” 这个类来处理的。

在Spring 2.5中

那么Spring是如何解析<mvc:annotation-driven/>标签的呢?

首先,必须要有一个继承自“org.springframework.beans.factory.xml.NamespaceHandlerSupport”的类,在其init方法中,注册自己的解析器,注册mvc解析器的类为MvcNamespaceHandler。一般针对每个元素,都有一个解析器,比如:针对annotation-driven,就有一个解析器:AnnotationDrivenBeanDefinitionParser。

解析器必须实现org.springframework.beans.factory.xml.BeanDefinitionParser接口,这个接口只有一个parse方法,它有两个参数,第一个参数org.w3c.dom.Element就是我们在xml文件中声明的<mvc:annotation-driven/>结点,拿到这个结点信息,就可以开始具体的业务了。

Spring怎么知道处理mvc开头的标签就调用MvcNamespaceHandler中注册的解析器呢?

需要有一个"mvc”<–>MvcNamespaceHandler这样一个映射关系,那么这个映射关系在哪里呢?就在META-INF目录下的spring.handlers:源文件中的内容:

http\://www.springframework.org/schema/mvc=
org.springframework.web.servlet.config.MvcNamespaceHandler

这里定义了只要是http\://www.springframework.org/schema/mvc命名空间的标签,就使用org.springframework.web.servlet.config.MvcNamespaceHandler中的解析器。

头文件里说的http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd,并不是真的到网上去下载这个文件,在spring.schemas文件中,定义了它指向org/springframework/web/servlet/config/spring-mvc-3.0.xsd这个文件(在jar包里)。

所以,在Spring中,想使用自己的命名空间:

1、首先需要一个xsd文件,来描述自定义元素的命名规则,并在再Spring的配置文件的<benas>头中引用它。

2、然后需要实现一个BeanDefinitionParser接口,在接口的parse方法中,解析将来在Spring配置文件中出现的元素。(如果xsd声明可以有多个元素,需呀实现多个BeanDefinitionParser接口)

3、最后需要继承一个NamespaceHandlerSupport类,在它的init方法中,调用registerBeanDefinitionParser方法,将待解析的xml元素与解析器绑定。

4、在META-INF目录下,创建spring.schemas、spring.handlers文件,建立最高级的映射关系以便Spring进行处理。

posted on 2011-07-09 17:21  瓶叔  阅读(55241)  评论(0编辑  收藏  举报