概述
概述
这里,Spring MVC
DispatcherServlet
策略初始化过程特指的是其方法initStrategies
的执行过程。也就是我们常说的Spring MVC
9大策略组件的初始化过程。这9大策略组件是 :
MultipartResolver
LocaleResolver
ThemeResolver
HandlerMapping
HandlerAdapter
HandlerExceptionResolver
RequestToViewNameTranslator
ViewResolver
FlashMapManager
该初始化方法initStrategies
会在DispatcherServlet
初始化过程中被调用,调用堆栈大致如下:
GenericServlet#init
=> HttpServletBean#initServletBean
=> FrameworkServlet#initWebApplicationContext
=> DispatcherServlet#onRefresh
=> DispatcherServlet#initStrategies
DispatcherServlet
的运行时,也就是对每个客户请求的处理,必须要发生在以上初始化过程完成之后。
注意 :
DispatcherServlet
的初始化不一定会随着应用的初始化而初始化,而是在首次请求到达时,处理请求前被初始化。这是一种可以叫做"懒加载"的模式。
源代码解析
/**
* 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 | 初始化request 到view name 的翻译有关组件 |
#initViewResolvers | 初始化视图解析器有关组件 |
#initFlashMapManager | 初始化FlashMap 有关组件,用于redirect 等跳转时的参数传递 |
这些初始化方法初始化了DispatcherServlet
运行时所需要的各种策略组件。这些方法大致的处理流程都是首先尝试从容器获取指定类型或者名称的bean
组件,如果找得到则应用所找到的策略组件;如果找不到,则构建缺省策略组件并使用。
这里指的指出的是,Spring
容器中所存在的各种策略组件,是在应用启动时作为bean
定义注册到容器的,针对基于Java
配置模式的Spring MVC
应用,这些策略组件bean
的定义可以参考WebMvcConfigurationSupport
。
参考文章
Spring MVC 缺省配置类 WebMvcConfigurationSupport
最后
以上就是干净唇彩为你收集整理的Spring MVC DispatcherServlet 策略初始化过程概述概述源代码解析参考文章的全部内容,希望文章能够帮你解决Spring MVC DispatcherServlet 策略初始化过程概述概述源代码解析参考文章所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复