面试官:今天要不来聊聊SpringMVC吧?

面试官今天要不来聊聊SpringMVC吧?

候选者:我先简单说下我对SpringMVC的理解哈

候选者:SpringMVC我觉得它是对Servlet的封装,屏蔽掉Servlet很多的细节

候选者:举几个例子

候选者:可能我们刚学Servlet的时候,要获取参数需要不断的getParameter

候选者:现在只要在SpringMVC方法定义对应的JavaBean,只要属性名与参数名一致,SpringMVC就可以帮我们实现「将参数封装到JavaBean」上了

候选者:又比如,以前使用Servlet「上传文件」,需要处理各种细节,写一大堆处理的逻辑(还得导入对应的jar)

候选者:现在一个在SpringMVC的方法上定义出MultipartFile接口,又可以屏蔽掉上传文件的细节了。

候选者:例子还有很多,我就不一一赘述了。

b2c760647e0340dcad588e8538a874ac.png 

面试官既然你说SpringMVC是对Servlet的封装,你了解SpringMVC请求处理的流程吗?

候选者:嗯,当然了,我看过源码。总体流程大概是这样的

候选者:1):首先有个统一处理请求的入口

候选者:2):随后根据请求路径找到对应的映射器

候选者:3):找到处理请求的适配器

候选者:4):拦截器前置处理

候选者:5):真实处理请求(也就是调用真正的代码)

候选者:6): 视图解析器处理

候选者:7):拦截器后置处理

aad11b18c7ff4314b84775703679ef71.png 

面试官嗯,了解,可以再稍微深入点吗?

面试官:毕竟这随便在网上找张SpringMVC流程图,就可以答出来了,看不出来你看过源码啊

候选者:哦?那我就简单补充下细节吧。

候选者:统一的处理入口,对应SpringMVC下的源码是在DispatcherServlet下实现的

候选者:该对象在初始化就会把映射器、适配器、视图解析器、异常处理器、文件处理器等等给初始化掉

候选者:至于会初始化哪些具体实例,看下DispatcherServlet.properties就知道了,都配置在那了

候选者:所有的请求其实都会被doService方法处理,里边最主要就是调用doDispatch方法

候选者:通过doDispatch方法我们就可以看到整个SpringMVC处理的流程

0a4de935a14e4dcaa571511bfb7cc243.png 

候选者:查找映射器的时候实际就是找到「最佳匹配」的路径,具体方法实现我记得好像是在lookupHandlerMethod方法上

候选者:从源码可以看到「查找映射器」实际返回的是HandlerExecutionChain,里边有映射器Handler+拦截器List

候选者:前面提到的拦截器前置处理和后置处理就是用的HandlerExecutionChain中的拦截器List

99cbab8bdb8d43b1a0a4d386e8ad8f31.png 

候选者:获取得到HandlerExecutionChain后,就会去获取适配器,一般我们获取得到的就是RequestMappingHandlerAdapter

候选者:在代码里边可以看到的是,经常用到的@ResponseBody和@Requestbody的解析器

候选者:就会在初始化的时候加到参数解析器List中

候选者:得到适配器之后,就会执行拦截器前置处理

面试官:嗯

选者:拦截器前置处理执行完后,就会调用适配器对象实例的hanlde方法执行真正的代码逻辑处理

候选者:核心的处理逻辑在invokeAndHandle方法中,会获取得到请求的参数并调用,处理返回值

候选者:参数的封装以及处理会被适配器的参数解析器进行处理,具体的处理逻辑取决于HttpMessageConverter的实例对象

面试官:嗯,了解了。要不你再压缩下关键的信息

候选者:DispatcherServlet(入口)->DispatcherServlet.properties(会初始化的对象)->HandlerMapping(映射器)->HandlerExecutionChain(映射器+拦截器List) ->HttpRequestHandlerAdapter(适配器)->HttpMessageConverter(数据转换)

面试官:最后来画张流程图吧?

候选者:没问题(上网找的比我画的还要好)c6d5e244a0dd4070b9a3da8aeeb8826d.png 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蜀州凯哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值