spring mvc 原理(快速理解篇)

 

spring mvc 原理(快速理解篇)spring mvc 原理(快速理解篇)

 

这两张图大家应该都不陌生。

从图上来看就是:一个请求过来,front controller根据具体的请求路径分派到具体的controller,具体的controller处理请求并把处理结果返回给front Controller,front Controller 再把model、view结合起来最终返回给用户。

spring mvc 中的DispatcherServlet的角色就是front controller,DispatcherServlet的类图及接口具体如下图

spring mvc 原理(快速理解篇)

我们知道一个servlet的生命周期

1初始化阶段 调用init()方法
2响应客户请求阶段  调用service()方法
3终止阶段  调用destroy()方法

所有的处理会放到service方法的实现中,FrameworkServlet里面实现了service()方法,同时在service()里面调用了一个抽象方法doService(),DispatcherServlet实现了doService()方法。简单理解DispatcherServlet在服务起来的时候会执行doService()方法,

大家可以看下DispatcherServlet的源码,比较容易理解:

首先看下类的结构图如下:

spring mvc 原理(快速理解篇)

1、当服务启动的时候,调用servlet的init方法【此处是HttpServletBean的init方法】,HttpServletBean的init方法中调用了initServletBean方法
2、FrameworkServlet实现了initServletBean方法,这个方法调用initWebApplicationContext()执行上下文Bean初始化
3、FrameworkServlet.initWebApplicationContext方法首先获取自己的双亲上下文(也就是ContextLoaderListener初始化成功的WebApplicationContext);然后创建或者获取当前Servelet的WebApplicationContext
4、WebApplicationContext执行configureAndRefreshWebApplicationContext()方法进行上下文容器初始化【在configureAndRefreshWebApplicationContext方法里构造bean工厂和容器里bean的创建】

以上是init处理的情况,init结束后,来看下service:

1、servlet的init结束后,调用service方法,FrameworkServlet实现了service方法,覆盖了父类HttpServlet
2、FrameworkServlet的service方法会调用doService,DispatcherServlet实现了doService方法【父类的抽象方法doService】
3、doService方法中调用了doDispatch方法。
4、mappedHandler = getHandler(processedRequest, false);通过该方法的处理,根据handlermapping找到具体的HandlerExecutionChain。然后执行HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());最终找到具体的HandlerAdapter
5、mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
6、HandlerAdapter是配到合适的handler然后处理,之后得到ModelAndView对象
7、拿到ModelAndView对象进行处理,最终返回用户具体的页面

第四步可以结合下面的图:

spring mvc 原理(快速理解篇)

下面这张图是根据handlermapping找到具体的HandlerExecutionChain

spring mvc 原理(快速理解篇)

第五步结合如下图片来看:

spring mvc 原理(快速理解篇)