在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進行處理。