SpringMVC源代碼學習外傳(一)xml命名空間的解析NamespaceHandler
阿新 • • 發佈:2017-08-17
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