Spring MVC之DispatcherServlet的初始化及组件装配
了解SpringMVC
的前端控制器截获请求后如何工作?如何分派请求。
前言
- 先理下
DispatcherServlet
与HttpServlet
的关系:
DispatcherServlet 继承自 FrameworkServlet;
FrameworkServlet 继承自 HttpServletBean,实现了ApplicationContextAware
接口;
HttpServletBean 继承自 HttpServlet。
继承关系原码如下:
1 | public class DispatcherServlet extends FrameworkServlet { ... } |
DispatcherServlet初始化
DispatcherServlet初始化方法:
initStrategies()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);//初始化上传文件解析器
initLocaleResolver(context);//初始化本地化解析器
initThemeResolver(context);//初始化主题解析器
initHandlerMappings(context);//初始化处理器映射器,将请求映射到处理器
initHandlerAdapters(context);//初始化处理器适配器
//初始化处理器异常解析器,处理执行过程出现的异常
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);//初始化请求到视图解析器
//初始化视图解析器,解析逻辑视图名到具体视图实现
initViewResolvers(context);
//初始化flash映射管理器
initFlashMapManager(context);
}initStrategies() 方法将在
WebApplicationContext
初始化后自动执行,自动扫描上下文的Bean
,根据名称或类型匹配的机制查找自定义的组件。
如果没有找到,则会自动装配一套Spring
默认的组件。在org.springframework.web.servlet
路径下有一个DispatcherServlet.properties
的配置文件,该文件定义了所使用的默认组件。
1 | Default implementation classes for DispatcherServlet's strategy interfaces. |
DispatcherServlet装配组件细节
总共会扫描检测 9 个组件,先查找对应类型的 Bean 如果没有则使用配置文件默认实现的类。
本地化解析器
只允许一个实例
先查找名为localeResolver
,类型为LocaleResolver
的Bean
作为该类型组件。如果没找则使用默认。主题解析器
只允许一个实例
先查找,如果没有则使用默认。处理器映射器
充许多个实例
先查找,如果没有则使用默认。处理器适配器
允许多个实例
先查找,如果没有,则使用默认配置中的三个实现类分别创建一个适配器,并添加到适配器列表。处理器异常解析器
允许多个实例
初始化时先查找,没有则使用默认的实现类,配置文件第一个实现类已弃用
该异常解器定义的是一个接口,用户可以实现该接口来自定义处理器异常解析器的实现类,来处理异常或记录日志或根据异常返回不同的结果。视图名称解析器
只允许一个实例
先查找,如果没有则使用默认。视图解析器
允许多个实例
先查找,如果没有则使用默认。文件上传解析器
只允许一个实例
先查找,如果没有将不会加载该类型的组件。FlashMap映射管理器
查找名为FlashMap
,类型为SessionFlashMapManager
的Bean
作为该类型组件,用于管理FlashMap
,即数据默认存储在HttpSession
中。
Spring MVC之DispatcherServlet的初始化及组件装配
http://blog.gxitsky.com/2017/12/31/SpringMVC-05-dispatchservlet-desc/