在Spring3.0中web
在Spring3.0.5这个版本上,<mvc:annotation-driven/>声明是没有 defaultAnnotationHandlerMapping这个属性的,对于@ResultMapping标签的解析,是写死了必须用 "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping” 这个类来处理的。spring
在Spring 2.5中spring-mvc
那么Spring是如何解析<mvc:annotation-driven/>标签的呢?mvc
首先,必需要有一个继承自“org.springframework.beans.factory.xml.NamespaceHandlerSupport”的类,在其init方法中,注册本身的解析器,注册mvc解析器的类为MvcNamespaceHandler。通常针对每一个元素,都有一个解析器,好比:针对annotation-driven,就有一个解析器:AnnotationDrivenBeanDefinitionParser。app
解析器必须实现org.springframework.beans.factory.xml.BeanDefinitionParser接口,这个接口只有一个parse方法,它有两个参数,第一个参数org.w3c.dom.Element就是咱们在xml文件中声明的<mvc:annotation-driven/>结点,拿到这个结点信息,就能够开始具体的业务了。dom
Spring怎么知道处理mvc开头的标签就调用MvcNamespaceHandler中注册的解析器呢?spa
须要有一个"mvc”<–>MvcNamespaceHandler这样一个映射关系,那么这个映射关系在哪里呢?就在META-INF目录下的spring.handlers:源文件中的内容:code
http\://www.springframework.org/schema/mvc =org.springframework.web.servlet.config.MvcNamespaceHandler
这里定义了只要是http\://www.springframework.org/schema/mvc命名空间的标签,就使用org.springframework.web.servlet.config.MvcNamespaceHandler中的解析器。xml
头文件里说的http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd,并非真的到网上去下载这个文件,在spring.schemas文件中,定义了它指向org/springframework/web/servlet/config/spring-mvc-3.0.xsd这个文件(在jar包里)。blog
因此,在Spring中,想使用本身的命名空间:
一、首先须要一个xsd文件,来描述自定义元素的命名规则,并在再Spring的配置文件的<benas>头中引用它。
二、而后须要实现一个BeanDefinitionParser接口,在接口的parse方法中,解析未来在Spring配置文件中出现的元素。(若是xsd声明能够有多个元素,需呀实现多个BeanDefinitionParser接口)
三、最后须要继承一个NamespaceHandlerSupport类,在它的init方法中,调用registerBeanDefinitionParser方法,将待解析的xml元素与解析器绑定。
四、在META-INF目录下,建立spring.schemas、spring.handlers文件,创建最高级的映射关系以便Spring进行处理。