Spring MVC之DispatcherServlet的初始化及组件装配

了解SpringMVC的前端控制器截获请求后如何工作?如何分派请求。

前言

  1. 先理下DispatcherServletHttpServlet的关系:
    DispatcherServlet 继承自 FrameworkServlet;
    FrameworkServlet 继承自 HttpServletBean,实现了ApplicationContextAware接口;
    HttpServletBean 继承自 HttpServlet。

继承关系原码如下:

1
2
3
4
public class DispatcherServlet extends FrameworkServlet { ... }	
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware { ... }

public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware { ... }

DispatcherServlet初始化

  1. DispatcherServlet初始化方法:initStrategies()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);//初始化上传文件解析器
    initLocaleResolver(context);//初始化本地化解析器
    initThemeResolver(context);//初始化主题解析器
    initHandlerMappings(context);//初始化处理器映射器,将请求映射到处理器
    initHandlerAdapters(context);//初始化处理器适配器
    //初始化处理器异常解析器,处理执行过程出现的异常
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);//初始化请求到视图解析器
    //初始化视图解析器,解析逻辑视图名到具体视图实现
    initViewResolvers(context);
    //初始化flash映射管理器
    initFlashMapManager(context);
    }

  2. initStrategies() 方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,根据名称或类型匹配的机制查找自定义的组件。

如果没有找到,则会自动装配一套Spring默认的组件。在org.springframework.web.servlet路径下有一个DispatcherServlet.properties的配置文件,该文件定义了所使用的默认组件。

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
// Default implementation classes for DispatcherServlet's strategy interfaces.
// Used as fallback when no matching beans are found in the DispatcherServlet context.
// Not meant to be customized by application developers.

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

DispatcherServlet装配组件细节

总共会扫描检测 9 个组件,先查找对应类型的 Bean 如果没有则使用配置文件默认实现的类。

  1. 本地化解析器
    只允许一个实例
    先查找名为localeResolver,类型为LocaleResolverBean作为该类型组件。如果没找则使用默认。

  2. 主题解析器
    只允许一个实例
    先查找,如果没有则使用默认。

  3. 处理器映射器
    充许多个实例
    先查找,如果没有则使用默认。

  4. 处理器适配器
    允许多个实例
    先查找,如果没有,则使用默认配置中的三个实现类分别创建一个适配器,并添加到适配器列表。

  5. 处理器异常解析器
    允许多个实例
    初始化时先查找,没有则使用默认的实现类,配置文件第一个实现类已弃用
    该异常解器定义的是一个接口,用户可以实现该接口来自定义处理器异常解析器的实现类,来处理异常或记录日志或根据异常返回不同的结果。

  6. 视图名称解析器
    只允许一个实例
    先查找,如果没有则使用默认。

  7. 视图解析器
    允许多个实例
    先查找,如果没有则使用默认。

  8. 文件上传解析器
    只允许一个实例
    先查找,如果没有将不会加载该类型的组件。

  9. FlashMap映射管理器
    查找名为FlashMap,类型为SessionFlashMapManagerBean作为该类型组件,用于管理FlashMap,即数据默认存储在HttpSession中。

Spring MVC之DispatcherServlet的初始化及组件装配

http://blog.gxitsky.com/2017/12/31/SpringMVC-05-dispatchservlet-desc/

作者

光星

发布于

2017-12-31

更新于

2022-06-17

许可协议

评论