SpringMVC(五):DispatcherServlet的初始化及组件装配

star2017 1年前 ⋅ 396 阅读

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

前言

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

继承关系原码如下:

    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()

    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的配置文件,该文件定义了所使用的默认组件。

     // 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中。

更多内容请访问:IT源点

全部评论: 0

    我有话说: