Spring MVC 原理 - DispatcherServlet调用完整过程(上)

本篇主要讲解了Spring mvc的调用过程,通过这个过程来了解Spring的原理。


进入web.xml中配置的Spring拦截(调度)器:

 

调用堆栈信息:



开始拦截,这一步主要是根据request获取handler(该handler可以配置)



(接上面方法)这段代码中的if(isGet…主要解决浏览器的缓存问题,如果没有过修改,则返回(浏览器可能会用缓存响应)。



调用方法handler



进入handler方法:



进入方法invokeHandlerMethod:



440行进入下一个方法invokeHandlerMethod:




进入该方法:



171行进入处理参数的方法:




处理参数的方法,使用参数类型进行for循环:



获取一个参数的注解:


通过下面方法返回注解数组:


其中parameterIndex在创建该对象时赋值,和参数类型的位置是对应的(下图中的i):



获取注解之后,对注解进行遍历,通过判断注解类型来获取paramNameheaderName或其他:



在每个if中的defaultValue,方法parseDefaultValueAttribute用来获取注解的默认值设置:


可以看到系统用了一个不常用的字符串作为默认值,用这个值和传入的value进行比较,使用这个值的目的是尽可能和用户设置的值区分开。


指定类型的注解(if判断里面的),只能存在一个,超过1个会报错


如果没有注解,则判断类型是否为常用的(request,response,session)


对于没有注解的参数,可能会执行下面的方法:


进入处理标准类型的方法:




通过上面的方法判断出基本的类型。


回到有注解的情况,针对不同的注解,具体处理过程如下(if顺序没有优先级,因为只有一个注解,一种情况):



到这一步,会根据具体的注解类型执行不同的resolve***()方法。

resolve***的方法最终返回的是类型符合要求(resolve内部有各种类型转换的方法)的参数值。


最后处理完成,返回参数列表:


反射调用方法:


进入用户写的处理方法中:


在用户方法执行完成后,返回:


到这里,主要的方法就执行完了,后面还有对返回结果result的处理,后面的内容不是很多了,由于本篇已经包含了30多张图片,插入图片已经很不方便,所以考虑分成两个部分来说明,并且尽力让这第一部分比较完整。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isea533

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值