java调试过程分析,Spring源码阅读——通过debug源码解析SpringMVC的流程

准备

简单搭建一个Spring MVC的项目,并写一个Controller,运行一个基本的请求转发

DispatcherServlet类图分析

fb2f980982573195df1bfd49f5198dba.png

由此图我们可以分析的到,DispatcherServlet继承的FrameworkServlet实现了Spring中的ApplicationContextAware接口,然后又间接继承了HttpServlet。所以实质上是一个Servlet,(因为Spring MVC的切入口是Servlet,不同于Struts2,是Filter)。实现ApplicationContextAware,就可以拿到Spring的容器,就能获取Spring容器中的@Controller注解的类等。

断点调试

断点调试DispatcherServlet.class->onRefresh()->initStrategies(),来看下Spring MVC的初始化流程。

第一个过程

首先Spring已经把我们注解或者xml配置的bean装载进去了,

在这个阶段,DispatcherServlet会从Spring容器中取出bean用于初始化HandlerMapping、HandlerAdapter、ViewResolver等放入DispatcherServlet对象中。断点init*方法即可看到其过程。

HandlerMapping的作用是根据request找到对应的处理器Handler

HandlerAdapter的作用是调用具体的方法对用户发来的请求来进行处理

ViewResolver的作用是把Handler返回的逻辑视图名称解析为真正的视图View对象。

第二个过程:

请求映射与包装返回:

在web.xml中,配置servlet的servlet-mapping的url为/,那么所有的请求都会进入这个DispatcherServlet中。

在FrameworkServlet中,重写了service方法,当然这里只是做一些判断。

(service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法)

请求进入后,一次进入方法:

service()->进入相应的doGet或doPost等->processRequest()->doService()->doDispatch()

doDispatch这个方法是映射的核心,在其中,会去拿到request地址对应的mappedHandler,从而拿到对应的HandlerAdapter,然后HandlerAdapter执行handle方法(可以理解为去反射执行对应的Controller中的方法),返回ModelAndView。

最后就是视图解析的过程了。

整理流程:

用户发送请求至前端控制器DispatcherServlet。

DispatcherServlet收到请求调用HandlerMapping处理器映射器。

处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

DispatcherServlet调用HandlerAdapter处理器适配器。

HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

Controller执行完成返回ModelAndView。

HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

ViewReslover解析后返回具体View。

DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

DispatcherServlet响应用户。

990c46b9b64034edc29783db4b4dea1a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值