Spring MVC 源码跟踪

按照程序执行流程看下执行顺序
当我们发送一个请求的时候,最开始进入的是DispatcherServlet
我们来看下这个类:
在这里插入图片描述
查看这个类的引用后,会发现他就是一个标准的Servlet
然而Servlet的生命周期是:
init()——>service()——>distory()
最开始执行init()方法,下面来跟踪一下执行流程:
在DispatcherServlet父类FrameworkServlet类中没有发现init()方法,继续找父类,在HttpServletBean类中发现init()方法:
在这里插入图片描述
并且我们发现它是通过final修饰的,这说明什么,说明了到这重写完之后其它的子类不能去从写,也就是说不管写多少个子类最先走的一定是这个方法(不能被从写但是public是可以被集成的)。
在这个方法中,重点看一下这个方法initServletBean()初始化bean的方法:
在这里插入图片描述
如上图我们可以看到,它的子类是FrameworkServlet所以它走的就是FrameworkServlet这个类进入这个类的方法实现:
在这里插入图片描述
我们看initWebApplicationContext()方法把赋值给了一个全局变量:webApplicationContext(这个是属于spring)
接下来我们看看initWebApplicationContext()方法给我做了一个什么事情
在这里插入图片描述
rootContext获取到的Spring容器,空的mac对象被赋值SpringMVC容器
这里重要的一个操作红框框处就是设置父容器为Spring容器,这里说明了一个问题,Spring跟SpringMVC是父子关系也就是说spring包含了springMVC,也就是说明了SpringMVC容器可以调用Spring中所有的内容。
init()走完它的方法,实现的是初始化的是一个子容器。
在这里插入图片描述
这个方法里面是所以SpringMVC的所有组件:
常用的有一下几个:
initHandlerMappings()解析请求
initHandlerAdapters()调用方法
initViewResolvers()解析视图
initMultipartResolver()文件上传
initHandlerExceptionResolvers()异常映射
接着执行service(),跟踪看看:
发现DispatcherServlet里面没有发现service()方法,只有doService方法
在这里插入图片描述
然后我们查看它的父类FrameworkServlet里面有service()方法:
在这里插入图片描述
这里执行了获取请求的方法,放行请求,这里就是获取判断方法放行到DispatcherServlet 里的doService()在这个方法进行了参数的解析,然后放入到map集合里。
在这里插入图片描述
这里entry.getKey()获取到的就是web.xml配置的key=“demo”,这里会进行检查如果没有带"/“就会给它加上”/",也就是说"demo"="/demo"。
在这里插入图片描述
在这里插入图片描述
这里就把解析完成的路径跟需要调用的对象,保存在map集合中
在这里插入图片描述
handler强转成Controller,handleRequest()方法调用它的实现类,这样就结束了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值