一篇文章明白springMVC运行流程

3 篇文章 0 订阅
1 篇文章 0 订阅

springMVC主干流程比较明朗,本篇以主要流程为主。把参数的获取,方法的执行,返回参数的处理的主要思想和调用方法都说了一遍。由于内容有点多,请耐心品读。相信一定对springMVC收获不少。
springMVC启动主要是启动DispatcherServlet来完成springMVC的环境初始化,当然DispatcherServlet可以在spring启动的时候加载也可以用懒加载。
DispatcherServlet会调用initStrategies方法来完成mvc上下文环境的初始话,我们可以看到HandlerMappings、HandlerAdapters等都会在此进行初始化。
在这里插入图片描述
另外,spring在启动的时候,在创建requestMappingHandlerMapping的对象时会调用afterPropertiesSet方法,然后调用initHandlerMethods方法,在initHandlerMethods里先获取出所有的beannames,然后循环所有的beannames,遇到添加Controller或者RequestMapping的注解,就调用detectHandlerMethods,在detectHandlerMethods中获取出类中的所有映射方法,循环所有的映射方法,调用registerHandlerMethod,最终将方法和路径名放到mappingLookup 同时也会放到urlLookup的LinkedMultiValueMap中,如果一个mapping中对应多个url,那么LinkedMultiValueMap就会多个url对应一个mapping去存放。

当请求到达DispatcherServlet时,就会调用doService方法,然后调用doDispatch。在doDispatch中先去调用getHandler,获取HandlerExecutionChain,HandlerExecutionChain这就是我们说的Handler。为什么要调用Handler,不是直接去到controller进行处理业务呢?原因也很简单。我们的controller层不仅可以用注解的方式实现,也可以实现接口的方式实现控制层的功能。所以这里我们就要先去推断controller类型,并且找到请求地址对应在项目中的controller的信息。getHandler最终会根据urlLookup找到mapping,然后分局mapping在mappingLookup拿到对应的handlerMethod,在去设置handlerMethod中对应的bean对象,最后在HandlerExecutionChain中补充拦截器。返回到DispatcherServlet。这样就拿到了Handler了。
在这里插入图片描述
然后调用getHandlerAdapter,找到对应的适配器适配器分为注解适配器和非注解适配器。我们一般都是在controller加注解,所以就找到注解适配器RequestMappingHandlerAdapter。
在这里插入图片描述
找到适配器之后我们就去调用handle方法。
在这里插入图片描述
在handle方法中最终先调用getMethodArgumentValues获取参数值,在获取参数值中首先获取总长度,然后根据下标取出参数名字,如果有注解先用注解的名字,没有的话读取.java文件获取的每个方法对应的参数名字。取出名字之后就调用resolveName方法根据名字去request中拿值,然后返回args数组中。然后调用doInvoke将参数值传过去
在这里插入图片描述

在doInvoke中就会调用getBridgedMethod方法返回一个Method对象,然后根据bean对象和参数利用java的反射机制调用目标方法。在这里插入图片描述
在执行完我们写的业务逻辑之后会调用returnValueHandlers.handleReturnValue,
由于我们的返回类型有点多,有时候会是字符串,有时候会是json,有时候会是ModelAndView等等。
所以在handleReturnValue中会调用selectHandler选择一个Handler来处理我们的返回数据。selectHandler方法里面是一个private final List returnValueHandlers =
new ArrayList();集合循环找到我们对应的Handler。比如我们加了ResponseBody注解,就会找到RequestResponseBodyMethodProcessor。此处运用了观察者设计模式
在这里插入图片描述
最后调用handleReturnValue将结果写回浏览器。
如果返回的是ModelAndView的话,就会调用getModelAndView方法处理jsp页面。
这样一个请求就完整的处理完了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值