Spring MVC运行过程
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View.
10、DispatcherServlet根据View进行渲染视图
11、DispatcherServlet响应用户。
几大组件:
组件 | 说明
—|—
DispatcherServlet | Spring MVC 的核心组件,是请求的入口,负责协调各个组件工作
HandlerMapping | 内部维护了一些 <访问路径, 处理器> 映射,负责为请求找到合适的处理器
HandlerAdapter | 处理器的适配器。Spring 中的处理器的实现多变,比如用户处理器可以实现 Controller 接口,也可以用 @RequestMapping 注解将方法作为一个处理器等,这就导致 Spring 不知道怎么调用用户的处理器逻辑。所以这里需要一个处理器适配器,由处理器适配器去调用处理器的逻辑。
ViewResolver | 视图解析器的用途不难理解,用于将视图名称解析为视图对象 View。
View | 视图对象用于将模板渲染成 html 或其他类型的文件。比如 InternalResourceView 可将 jsp 渲染成 html。
DispatcherServlet 源码

Aware:在 Spring 中,Aware 类型的接口可以用于向 Spring获取框架中的信息。当实现了 ApplicationContextAware 接口时,实例通过接口方法 setApplicationContext 传给该 bean。
EnvironmentCapable: 仅包含一个方法定义 getEnvironment,通过该方法可以获取到环境变量对象。
HttpServletBean:是 HttpServlet 抽象类的简单拓展。HttpServletBean 覆写了父类中的无参 init 方法,并在该方法中将 ServletConfig 里的配置信息设置到子类对象中,比如 DispatcherServlet。
FrameworkServlet:Spring Web 框架中的一个基础类,该类会在初始化时创建一个容器。同时该类覆写了 doGet、doPost 等方法,并将所有类型的请求委托给 doService 方法去处理。doService 是一个抽象方法,需要子类实现。
DispatcherServlet:即协调各个组件工作和初始化各种组件,比如 HandlerMapping、HandlerAdapter 等。入口方法:doDispatch
1 | protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { |
Web容器
一个 Web 应用通常有两个容器。一个容器用于加载 Web 层的类,比如接口 Controller、HandlerMapping、ViewResolver 等,叫做 web 容器;另一个容器用于加载业务逻辑相关的类,比如 service、dao 层的一些类,业务容器;在容器初始化的过程中,业务容器会先于 web 容器进行初始化;web 容器初始化时,会将业务容器作为父容器,这是因为web 容器中的一些 bean 会依赖于业务容器中的 bean。
父容器配置分析
配置
1 | <web-app> |
ContextLoaderListener分析
1 | public class ContextLoaderListener extends ContextLoader implements ServletContextListener { |
Web 容器创建
web容器的创建是在HttpServletBean抽象时,覆写了父类 HttpServlet 中的 init 方法。在此方法中来创建。
1 | //HttpServletBean覆写了init方法,对初始化过程做了一些处理。 |
web容器创建过程:
- 1、从 ServletContext 中获取 ContextLoaderListener 创建的容器
- 2、若 this.webApplicationContext != null 条件成立,仅设置父容器和刷新容器即可
- 3、尝试从 ServletContext 中获取容器,若容器不为空,则无需执行步骤4
- 4、创建容器,并将 rootContext 作为父容器
- 5、设置容器到 ServletContext 中