1. 程式人生 > >SpringMVC源代碼學習外傳(一)xml命名空間的解析NamespaceHandler

SpringMVC源代碼學習外傳(一)xml命名空間的解析NamespaceHandler

java ee 都是 replace 請求處理流程 reader spring ces tor source

以下內容基於書:《看透SpringMVC-源代碼分析與實踐》
基本照搬。。。用於自己查閱備忘。
加上外傳關鍵字的是討論一些SpringMVC的特定類的使用方法
非外傳的是對啟動流程/請求處理流程,我們可以看作主線劇情。

我們知道springMVC的配置都是寫在xml文件裏的,這些配置是怎麽從xml讀取的呢?
解析它們的是一個接口
位置在spring-beans-RELEASE.jar內org.springframework.beans.factory.xml.NamespaceHandler,
這是一個接口,內部有init、parse、decorate三個方法。
它的默認實現對象為NamespaceHandler-Support,這是一個抽象方法,一般的解析類都是直接繼承它。其代碼如下,僅舉有關paser的例子,還有一個decorater類似

private final Map<String, BeanDefinitionParser> parsers = new HashMap<String, BeanDefinitionParser>();
private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) {
    String localName = parserContext.getDelegate().getLocalName(element);
    BeanDefinitionParser parser = this.parsers.get(localName);
    if (parser == null) {
        parserContext.getReaderContext().fatal(
            "Cannot locate BeanDefinitionParser for element [" + localName + "]", element);
    }
    return parser;
}
protected final void registerBeanDefinitionParser(String elementName, BeanDefinitionParser parser) {
    this.parsers.put(elementName, parser);
}

再看一下實際的例子,解析mvc命名空間的是類是MvcNamespaceHandler,在抽象類的基礎上聲明Parser的內容就ok了。
代碼如下:

public class MvcNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
        registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
        registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
        registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
        registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
    }

}

SpringMVC源代碼學習外傳(一)xml命名空間的解析NamespaceHandler