博客
关于我
Spring源码分析二十一:Spring MVC② DispatcherServlet的初始化
阅读量:506 次
发布时间:2019-03-07

本文共 1960 字,大约阅读时间需要 6 分钟。

Spring 中 DispatcherServlet 的 初始化 原理

DispatcherServlet 作为 Spring Webmvc 的核心组件之一,在 应用程序 中扮演着重要的角色。它 的初始化过程涉及多个关键步骤,确保应用程序能够按期启动并 正确工作。本文将详细解析 DispatcherServlet 的初始化过程。


1. 从 Servlet 到 SpringBean

第一步:标准化初始化

DispatcherServlet 的初始化基于 Servlet API 的标准方法,具体来说是通过 HttpServletinit 方法。Spring 提供了 HttpServletBean 这个适配器,将传统的 Servlet 实现与 Spring 的注入机制集成。在 init 方法中,DispatcherServlet 主要完成以下任务:

  • 属性封装与验证

    ServletConfig 中提取所有初始化参数,并进行必要的属性验证,确保没有未配置的必需参数。

  • Bean 利用

    将当前 Servlet 实例转换为 Spring 的 BeanWrapper,以便对其属性进行注入。BeanWrapper 是 Spring 对 JavaBean 遍历的扩展版本,提供了更强大的属性操作功能。

  • 资源解析

    注册资源编辑器,以便能够解析诸如 Resource 类型的属性注入。

  • 初始注入

    进行最终的属性注入,并完成 ServletBean 的初始化。


  • 2. 自适应处理

    第二步:自适应属性注入

    为了适应不同类型的 Servlet 和 Spring 的配置要求,DispatcherServlet 提供了灵活的初始化处理方式:

  • 基于构造函数注入

    如果 Servlet 实例已经通过构造函数注入了 WebApplicationContext,则直接使用该实例,无需进一步配置。

  • 基于上下文属性注入

    如果没有通过构造函数注入,可以尝试从 ServletContext 中获取 WebApplicationContext。默认的 提取键名是 contextAttribute

  • 创建新实例

    如果前两种方法均未找到 WebApplicationContext ,则主动创建一个新实例。创建的新实例可以选择 XML 配置文件或 Annotation 配置文件作为依据。


  • 3. 应用上下文的创建

    第三步:核心上下文初始化

    创建好 WebApplicationContext 之后,需要进行进一步的初始化工作。这个过程由 initWebApplicationContext 方法负责。核心步骤包括:

  • 环境搭建

    WebApplicationContext 注入到 ServletContext 中,确保其他组件能够获取到它。

  • 刷新上下文

    调用 refresh 方法启动上下文的刷新过程。这是 Spring 中启动应用程序生命周期的关键步骤。


  • 4. 分支处理

    第四步:初始化子组件

    完成 WebApplicationContext 的刷新后,DispatcherServlet 会初始化其他相关组件。这些组件包括:

  • 多文件解析器

    初始化 MultipartResolver,用于处理文件上传请求。默认使用 CommonsMultipartResolver

  • 国际化解析器

    初始化 LocaleResolver,支持通过 URL、Cookie 或 Session 获取用户语言环境。

  • 主题解析器

    初始化 ThemeResolver,为应用程序提供统一的视觉风格。

  • 请求映射处理

    初始化 HandlerMapping,将请求转发给相应的处理器。主要负责 URL 到控制器的映射。

  • 处理器适配器

    初始化 HandlerAdapter,将处理器适配到 Spring 的注解框架。

  • 异常处理器

    初始化 HandlerExceptionResolver,提供错误处理的逻辑。

  • 视图转换器

    初始化 ViewResolver,定义如何将逻辑视图名称映射到实际视图。

  • FlashMapManager

    初始化 FlashMapManager,用于管理重定向时的 Flash 属性。


  • 5. 框架自我刷新

    第五步:框架自刷新

    对于内部处理,DispatcherServlet 还提供了一些模板方法,例如 onRefresh。在支持多种配置文件(如 DispatcherServlet.properties)的情况下,默认策略可以灵活配置。


    总结

    DispatcherServlet 的初始化过程虽然繁琐,但其设计十分成熟和可靠。通过合理配置和注入,可以满足不同应用场景的需求。在实际开发中,可以根据项目需求灵活配置环境和策略,以确保最优性能和开发体验。

    转载地址:http://uykcz.baihongyu.com/

    你可能感兴趣的文章
    OSPF 四种设备角色:IR、ABR、BR、ASBR
    查看>>
    OSPF 四种路由类型:Intra Area、Inter Area、第一、二类外部路由
    查看>>
    OSPF 学习
    查看>>
    OSPF 支持的网络类型:广播、NBMA、P2MP和P2P类型
    查看>>
    OSPF 概念型问题
    查看>>
    OSPF 的主要目的是什么?
    查看>>
    OSPF5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文
    查看>>
    SQL Server 存储过程分页。
    查看>>
    OSPF不能发现其他区域路由时,该怎么办?
    查看>>
    OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
    查看>>
    SQL Server 存储过程
    查看>>
    OSPF在大型网络中的应用:高效路由与可扩展性
    查看>>
    OSPF太难了,这份OSPF综合实验请每位网络工程师查收,周末弯道超车!
    查看>>
    OSPF技术入门(第三十四课)
    查看>>
    OSPF技术连载10:OSPF 缺省路由
    查看>>
    OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
    查看>>
    OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
    查看>>
    OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
    查看>>
    OSPF技术连载14:OSPF路由器唯一标识符——Router ID
    查看>>
    OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
    查看>>