继承结构
- HttpServletBean 是 Spring 对 HttpServlet 最底层的抽象,在这里 Spring 把 Servlet 视作一个 Bean
- FrameworkServlet 是对 HttpServletBean 的进一步抽象,真正初始化一个 Spring 的容器(WebApplicationContext)
- DispatcherServlet 对容器(容器用于管理组件)进行初始化以达到对组件进行逻辑调用的目的
SpringMVC 自身对于组件并未实现一套完整的管理机制,而是借用了 Spring Framework 核心框架中容器的概念,将所有的组件纳入到容器中进行管理。一个组件的多种行为模式可以在容器中共存,容器将负责对这些实现类进行管理。
数据结构
- 红线以上是参数配置,控制 SpringMVC 组件的初始化行为方式
- 红线以下是核心组件,SpringMVC 的核心逻辑处理组件
DispatcherServlet 是程序的入口,在 web.xml 中配置
在之前 Servlet 模式中,web.xml 配置项目的所有请求-响应映射关系。项目规模扩大之后,请求-响应的映射关系全部定义在 web.xml 中,将造成 web.xml 的不断膨胀而变得难以维护。针对这一点,SpringMVC 提炼一个核心的 Servlet 覆盖对所有 Http 请求的处理,也就是 DispatcherServlet。
要做到能分发所有的请求,核心分发器需要做到:① 能够根据一定的规则对不同的 Http 请求分发到不同的 Servlet 对象上去进行处理 ② 能够建立起一整套完整的对所有 Http 请求进行规范化处理的流程(不同协议之间的转化,从 Http 协议到 Java)。
为了做到这 2 点,SpringMVC 所提出 2 点:
- 处理流程规范化 —— 将处理流程划分为若干个步骤(任务),并使用一条明确的逻辑主线将所有的步骤串联起来
- 处理流程组件化 —— 将处理流程中的每一个步骤(任务)都定义为接口,并为每个接口赋予不同的实现模式
其中流程步骤为:
1)对 Http 请求进行初步处理,查找与之对应的 Controller 处理类(方法)——HandlerMapping 接口(组件)
2)调用相应的 Controller 处理类(方法)完成业务逻辑——HandlerAdapter 接口(组件)
3)对 Controller 处理类(方法)调用时可能发生的异常进行处理——HandlerExceptionResolver 接口(组件)
4)根据 Controller 处理类(方法)的调用结果,进行 Http 响应处理——ViewResolver 接口(组件)
这 4 个步骤对应的 4 个接口就是 Spring 的组件,而 DispatcherServlet 就是把这些组件串联在一起,实现分发请求的功能。那么 SpringMVC 要怎么管理这些组件呢?我们必须借助一个有效的手段对整个 SpringMVC 的组件进行定义,而这一点正是通过核心配置文件来完成的。
组件是处理流程的抽象化,因而所有组件都是接口,接口最重要意义是定义操作规范,一个接口可以有多个不同的实现类,代表的是对于相同的逻辑语义的不同解读方式。或者说一个接口的每一个不同的实现分支,代表了相同操作规范的不同行为模式。举个例子,根据Http请求查找与之对应的Controller的组件HandlerMapping的树形实现体系:
- BeanNameUrlHandlerMapping —— 根据 Spring 容器中的 bean 的定义来指定请求映射关系
- SimpleUrlHandlerMapping —— 直接指定 URL 与 Controller 的映射关系,其中的 URL 支持 Ant 风格
- DefaultAnnotationHandlerMapping —— 支持通过直接扫描 Controller 类中的 Annotation 来确定请求映射关系
- RequestMappingHandlerMapping —— 通过扫描 Controller 类中的 Annotation 来确定请求映射关系的另外一个实现类
由此可以看出,组件化(接口化)体系是 SpringNVC 对行为模式的扩展的有效途径,SpringMVC 是一个基于组件的开发框架
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于