前文《SpringMVC源码解析(4):DispatcherServlet上下文初始化 》介绍了:DispatcherServlet在初始化上下文过程中会调用OnFresh()方法强制刷新上下文。DispatcherServlet重写了该方法,其中只调用了一个initStrategies()方法。这个方法的作用是初始化SpringMVC框架所需的各种组件。
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
这些组件的初始化过程基本雷同,首先查看一下BeanFactory中是否已经定义了组件的Bean,如果没有的话则初始化为默认的接口实现。本文重点介绍一下初始化中涉及到的九大组件。
(1)MultipartResolver
MultipartResolver的作用主要是用来处理文件上传的。默认情况下,是没有multipart处理的。如果需要的话,可以在配置文件中添加。
(2)LocaleResolver
LocaleResolver的作用是Spring国际化参数配置。Spring配置国际化有三种方式:基于URL的参数配置、基于session的配置和基于Cookie的国际化配置。
(3)ThemeResolver
ThemeResolver 负责配置Web页主题,从而控制网页风格。ThemeResolver 是主题解析器的接口,主要有三个常用实现类:
- FixedThemeResolver 是默认的主题解析器,选择固定的主题Theme;
- CookieThemeResolver 是从客户端cookie中获取主题Theme;
- SessionThemeResolver 是从session中获取主题Theme。
(4)HandlerMappings
客户端发出Request时,DispatcherServlet 会将Request提交给HandlerMappings,根据Web Application Context 的配置找到对应的Controller。
(5)HandlerAdapters
DispatcherServlet通过HandlerMappings得到处理器以后,会轮询HandlerAdapters模块,查找能够处理当前请求的处理器适配器的实现,包括:
- HTTPRequestHandlerAdapter 是HTTP请求处理器的适配,最终调用HttpRequestHandler的handleRequest方法。
- SimpleControllerHandlerAdapter 是将HTTP请求适配到一个控制器的实现进行处理。
- AnnotationMethodHandlerAdapter 本是用来适配@RequestMapping注解的处理器,不过在Spring3.1以后已被弃用,已被RequestMappingHandlerAdapter取代。
(6)HandlerExceptionResolvers
HandlerExceptionResolver是Spring MVC提供的一个通用异常处理工具,不过需要注意的是,它只能处理请求过程中抛出的异常。
(7)RequestToViewNameTranslator
这个接口的作用是从请求对象中获取 viewName。
public interface RequestToViewNameTranslator {
String getViewName(HttpServletRequest request) throws Exception;
}
(8)ViewResolvers
DispatcherServlet会根据ModelAndView选择合适的视图进行渲染,选择合适的视图就是ViewResolvers的工作。
DispatcherServlet 将配置的 ViewResolver 信息都存放在 viewResolvers 中。ViewResolvers中定义了resolverViewName()方法,根据viewName创建合适类型的View实现。
在 render() 方法中会调用 resolverViewName() 方法,在这个方法中逐一调用ViewResolver去取得View对象。
(9)FlashMapManager
FlashMapManager和FlashMap提供了存储请求数据的能力,在使用重定向时非常必要。在重定向之前暂存请求数据,以便重定向之后还能使用。
FlashMapManager接口的retrieveAndUpdate() 可以从Session中获取FlashMap对象。
以上就是DispatcherServlet初始化的过程,接下来我们要看一下DispatcherServlet处理请求过程的源码。
我会持续更新关于物联网、云原生、数字化技术方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,请大家多多关注,欢迎留言和转发,希望与大家互动交流,谢谢。
本文暂时没有评论,来添加一个吧(●'◡'●)