我是靠谱客的博主 干净唇彩,这篇文章主要介绍Spring MVC DispatcherServlet 策略初始化过程概述概述源代码解析参考文章,现在分享给大家,希望可以做个参考。

概述

这里,Spring MVC DispatcherServlet 策略初始化过程特指的是其方法initStrategies的执行过程。也就是我们常说的Spring MVC9大策略组件的初始化过程。这9大策略组件是 :

  • MultipartResolver
  • LocaleResolver
  • ThemeResolver
  • HandlerMapping
  • HandlerAdapter
  • HandlerExceptionResolver
  • RequestToViewNameTranslator
  • ViewResolver
  • FlashMapManager

该初始化方法initStrategies会在DispatcherServlet初始化过程中被调用,调用堆栈大致如下:

复制代码
1
2
3
4
5
6
GenericServlet#init => HttpServletBean#initServletBean => FrameworkServlet#initWebApplicationContext => DispatcherServlet#onRefresh => DispatcherServlet#initStrategies

DispatcherServlet的运行时,也就是对每个客户请求的处理,必须要发生在以上初始化过程完成之后。

注意 : DispatcherServlet的初始化不一定会随着应用的初始化而初始化,而是在首次请求到达时,处理请求前被初始化。这是一种可以叫做"懒加载"的模式。

源代码解析

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/** * Initialize the strategy objects that this servlet uses. * 初始化当前Servlet使用的各种策略对象 * May be overridden in subclasses in order to initialize further strategy objects. * 子类可以覆盖该方法用于初始化更多的策略对象 * */ // 参数 context : 当前web应用的应用上下文 // 比如一个基于springboot + tomcat 的 web应用 , context // 是一个 AnnotationConfigServletWebServerApplicationContext protected void initStrategies(ApplicationContext context) { // MultipartResolver 文件上传相关 // 从bean容器中获取名字为MULTIPART_RESOLVER_BEAN_NAME(multipartResolver)的bean // 记录到属性multipartResolver,没有相应bean的话设置为NULL initMultipartResolver(context); // LocaleResolver, 本地化语言相关 // 从bean容器中获取名字为LOCALE_RESOLVER_BEAN_NAME(localeResolver)的bean // 记录到属性localeResolver,没有相应bean的话使用缺省策略 initLocaleResolver(context); // ThemeResolver 相关 // 从bean容器中获取名字为THEME_RESOLVER_BEAN_NAME(themeResolver)的bean // 记录到属性themeResolver,没有相应bean的话使用缺省策略 initThemeResolver(context); // HandlerMapping (list) 相关 // 从bean容器中获取名字为HANDLER_MAPPING_BEAN_NAME(handlerMapping)的bean, // 或者获取所有类型是HandlerMapping的bean(DispatcherServlet的缺省做法), // 记录到属性handlerMappings,没有相应bean的话使用缺省策略 initHandlerMappings(context); // HandlerAdapter (list) 相关 // 从bean容器中获取名字为HANDLER_ADAPTER_BEAN_NAME(handlerAdapter)的bean, // 或者获取所有类型是HandlerAdapter的bean(DispatcherServlet的缺省做法), // 记录到属性handlerAdapters,没有相应bean的话使用缺省策略 initHandlerAdapters(context); // HandlerExceptionResolver (list) 异常处理Handler相关 // 从bean容器中获取名字为HANDLER_EXCEPTION_RESOLVER_BEAN_NAME(handlerExceptionResolver)的bean, // 或者获取所有类型是HandlerExceptionResolver的bean(DispatcherServlet的缺省做法), // 记录到属性handlerExceptionResolvers,没有相应bean的话使用缺省策略 initHandlerExceptionResolvers(context); // RequestToViewNameTranslator 相关 // 从bean容器中获取名字为REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME(viewNameTranslator)的bean // 记录到属性viewNameTranslator,没有相应bean的话使用缺省策略 initRequestToViewNameTranslator(context); // ViewResolver (list) 相关 // 从bean容器中获取名字为VIEW_RESOLVER_BEAN_NAME(viewResolver)的bean, // 或者获取所有类型是ViewResolver的bean(DispatcherServlet的缺省做法), // 记录到属性viewResolvers,没有相应bean的话使用缺省策略 initViewResolvers(context); // FlashMapManager 相关 // 从bean容器中获取名字为FLASH_MAP_MANAGER_BEAN_NAME(flashMapManager)的bean // 记录到属性flashMapManager,没有相应bean的话使用缺省策略 initFlashMapManager(context); }

上面的方法initStrategies分别初始化了DispatcherServlet运行时所需要的各种策略组件:

初始化方法任务/目的简介
#initMultipartResolver初始化文件上传有关组件
#initLocaleResolver初始化本地化有关组件
#initThemeResolver初始化主题切换有关组件
#initHandlerMappings初始化HandlerMapping有关组件
#initHandlerAdapters初始化HandlerAdapter有关组件
#initHandlerExceptionResolvers初始化HandlerExceptionResolver有关组件
#initRequestToViewNameTranslator初始化requestview name的翻译有关组件
#initViewResolvers初始化视图解析器有关组件
#initFlashMapManager初始化FlashMap有关组件,用于redirect等跳转时的参数传递

这些初始化方法初始化了DispatcherServlet运行时所需要的各种策略组件。这些方法大致的处理流程都是首先尝试从容器获取指定类型或者名称的bean组件,如果找得到则应用所找到的策略组件;如果找不到,则构建缺省策略组件并使用。

这里指的指出的是,Spring容器中所存在的各种策略组件,是在应用启动时作为bean定义注册到容器的,针对基于Java配置模式的Spring MVC应用,这些策略组件bean的定义可以参考WebMvcConfigurationSupport

参考文章

Spring MVC 缺省配置类 WebMvcConfigurationSupport

最后

以上就是干净唇彩最近收集整理的关于Spring MVC DispatcherServlet 策略初始化过程概述概述源代码解析参考文章的全部内容,更多相关Spring内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部