概述
上一篇找到了两个入口,本篇从DispatcherServlet类的initStrategies进行分析
DispatcherServlet初始化自身使用的对象
- 入口方法,做了九件事
- 初始化多媒体解析器,如果没有配置id为multipartResolver的,类型为MultipartResolver的bean,则没有提供多媒体解析器,可以参考链接博文,后面专门分析
- 初始化国际化解析器,如果配置文件没有定义,则使用AcceptHeaderLocaleResolver,可以参考链接博文,后面专门分析
- 初始化主题解析器,用来处理一些有关动态更换样式的支持,没有用过,前后端分离后,更不会用了。
- 初始化handleMapping,分析的重点
- 初始化适配器,分析重点
- 初始化异常解析器,如果没有配置,则没有异常解析器。后面进行分析,后面专门分析
- 初始化视图名称转换器,后面专门分析
- 初始化视图解析器,分析的重点
- 初始化FlashMapManager,这个东西是用在重定向时,在重定向之前的属性保存起来,这些属性可以给后一个请求使用。没有 用过,不进行分析
//DispatcherServlet类的方法
protected void initStrategies(ApplicationContext context) { initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); }
//spring-webmvc项目的DispatcherServlet.properties文件
//定义了一些默认的解析器
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
- 初始化HandlerMapping
private void initHandlerMappings(ApplicationContext context) { this.handlerMappings = null; if (this.detectAllHandlerMappings) { // Find all HandlerMappings in the ApplicationContext, including ancestor contexts. Map<String, HandlerMapping> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false); if (!matchingBeans.isEmpty()) { this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values()); // We keep HandlerMappings in sorted order. AnnotationAwareOrderComparator.sort(this.handlerMappings); } } else { try { HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class); this.handlerMappings = Collections.singletonList(hm); } catch (NoSuchBeanDefinitionException ex) { // Ignore, we'll add a default HandlerMapping later. } } // Ensure we have at least one HandlerMapping, by registering // a default HandlerMapping if no other mappings are found. if (this.handlerMappings == null) { this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class); if (logger.isDebugEnabled()) { logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default"); } } }
总结
本篇主要是找到DispathcerServlet初始化和请求处理的两个入口,以进行后面的分析
参考链接
- https://www.cnblogs.com/weknow619/p/6341395.html(ContextLoaderListener与DispatcherServlet的创建的上下文)
- http://www.cnblogs.com/fangjian0423/p/springMVC-dispatcherServlet.html(源码分析参考博文)
- https://www.cnblogs.com/tengyunhao/p/7670293.html(多媒体文件的解析)
- https://blog.csdn.net/qq924862077/article/details/52878507?locationNum=4&fps=1(国际化解析器)