SpringMVC原理解析

前身今世

Spring MVC是一种基于 MVC设计模式,请求-响应模型的轻量级Web框架,是当前毋庸置疑的最流行的Web框架。相比于Struts/Webx等老一辈Web框架,Spring MVC最主要有以下3点优势:

  • 易用性 :角色划分清晰,URL映射简洁明了,Spring Boot下零配置,学习成本低。

  • 兼容性 :与Spring无缝融合,天然享受Spring的抽象容器,面向切面,热部署等特性。

  • 扩展性 :基于"Open-Close"原则,处理器(Controller)、处理器映射(HandlerMapping)、视图解析器(ViewResolver)、视图(View)等组件都有强大的扩展性。

本文主要从 容器关系,核心分发器和抽象与扩展三个角度理解Spring MVC,这3个角度也基本上覆盖了Spring MVC的核心原理。

容器关系

建立在Spring基础之上,与Spring无缝融合是Spring MVC的重要优势。区别于Struts等非Spring族Web框架,Spring MVC能够天然地享受Spring带来的IOC,AOP,热部署等特性。Spring本身的容器设计已经高度抽象,并且获得巨大成功,Spring MVC的容器设计充分地站在了Spring巨人的肩膀上,将Spring容器和Spring MVC的Servlet容器关联起来,如下图。

SpringMVC context

在典型的Spring MVC应用中,会有两种ApplicationContext,一种是从applicationContext.xml里加载的 父容器(root ApplicationContext) ,另一种是从servlet-context.xml里加载的子容器(dispatcher ApplicationContext) ,两者是继承关系,子容器可以通过getParent()函数获取到父容器。

子容器可以访问到所有父容器中的信息,而父容器访问不到子容器的信息。父容器使得各个子容器的能够共享一些bean,而各个子容器之间又做到隔离。共享的父容器中,一般会放置后台业务逻辑相关的bean,如一些service类,DAO类,数据源等,而各个子容器会放置web请求-相应相关的类,也就是controller,viewResolver等,达到 共享与裁剪的目的。

核心分发器

DispatcherServlet作为Spring MVC核心分发器 ,再怎么强调它的重要性都不为过。Spring MVC官方文档的第一句话就是

The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet 和其他请求驱动的Web框架一样,Spring MVC也是围绕一个 将前端请求分发到相应控制器 的核心Servlet来设计的,这个Servlet就是DispatcherServlet。DispatcherServlet和其他框架中的Servlet不一样的地方在于,它和Spring容器无缝整合在了一起,因此我们可以在Spring MVC中使用Spring所有的特性。

整个请求-响应过程包括处理器(Controller),处理器映射器(HandlerMapping),处理器适配器(HandlerAdaptor),视图解析器(View Resolver),视图(View)等的流转,整个流程如下所示:

dispatcher

主要分为7个步骤:

  1. 用户请求 —> DispatcherServlet,核心分发器收到请求后自己不进行处理,而是作为统一访问点,进行全局的流程控制。

  2. DispatcherServlet —> HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易对映射策略进行扩展。

  3. DispatcherServlet —> HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。

  4. HandlerAdapter —> Handler,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据、逻辑视图名)。

  5. ModelAndView的逻辑视图名 —> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易扩展其他视图技术。

  6. View —> 渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,可以支持各种模板渲染引擎。

  7. 返回响应给用户

我们可以看到各个组件在MVC模式的协同下工作,整个系统架构又清晰又简洁。

抽象和扩展

Spring MVC是一个基于著名的 "Open-Close"即开闭原则 进行设计的框架。在Spring MVC官方文档里开宗明义地介绍了这种设计理念:

"Open for extension…​" A key design principle in Spring Web MVC and in Spring in general is the "Open for extension, closed for modification" principle.

围绕着DispatcherServlet的 每个组件都是抽象接口 ,Spring MVC提供了很多通用实现,开发者也可以很方便地定制自己的组件。Spring MVC主要的类关系如下图:

springmvc

文章目录
  1. 前身今世
  2. 容器关系
  3. 核心分发器
  4. 抽象和扩展