SpringMVC执行原理

1、SpringMVC执行流程图
249993-20161212142542042-2117679195.jpg

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

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

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

  4. DispatcherServlet调用HandlerAdapter处理器适配器。

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

  6. Controller执行完成返回ModelAndView。

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

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

  9. ViewReslover解析后返回具体View。

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

  11. DispatcherServlet响应用户。

2、源码解读

20230224194710.png

20230224194929.png

20230224195018.png

20230224195209.png
20230224195306.png
20230224195642.png
20230224195801.png
20230224195909.png
20230224200055.png
20230224200207.png
20230224200302.png
20230224200504.png
20230224200541.png
20230224200625.png
20230224200741.png

DispatcherServlet有List<HandlerAdapter> handlerAdapters List<HandlerMapping> handlerMappings属性。首先遍历handlerMappings集合通过HttpServletRequest匹配获取到对应的HandlerExecutionChain对象,最后通过HandlerExecutionChain获取HandlerMethod对象(最难理解的Object),遍历handlerAdapters,通过support(),取到对应的HandlerAdapter对象。执行HandlerExecutionChain中的所有的HandlerInterceptor。然后再执行HandlerAdapter的handle()。handle()会执行AbstractHandlerMethodAdapter的handleInternal()方法。然后会执行RequestMappingHandlerAdapter的handleInternal(),invokeHandlerMethod(),执行createInvocableHandlerMethod(),执行ServletInvocableHandlerMethod的invokeAndHandle(),执行invokeForRequest(),InvocableHandlerMethod的invokeForRequest(),doInvoke(),method.invoke(this.getBean(), args)通过反射执行Controller方法。

3、AOP的执行顺序

Spring4
正常:
1、环绕通知前
2、@Before通知
3、程序逻辑
4、环绕通知后
5、@After通知
6、@AfterReturning通知
异常:
1、环绕通知前
2、@Before通知
3、@After通知
4、@AfterThrowing异常通知

Spring5
正常:
1、环绕通知前
2、@Before通知
3、程序逻辑
4、@AfterReturning通知
5、@After通知
6、环绕通知后
异常:
1、环绕通知前
2、@Before通知
3、@AfterThrowing异常通知
4、@After通知

4、过滤器拦截器执行顺序

1401949-20220414161752833-262609161.png

5、拦截器和过滤器的区别

  1. 过滤器是servlet中的对象,拦截器是框架中的对象。
  2. 过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor。
  3. 过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。
    拦截器是用来验证请求的,能截断请求。
  4. 过滤器是在拦截器之前先执行的。
  5. 过滤器是Servlet容器创建的对象,
    拦截器是springmvc容器中创建的对象。
  6. 过滤器可以处理jsp,js,html等等,
    拦截器是侧重拦截对Controller的对象。如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容。
  7. 拦截器拦截普通类方法执行,过滤器过滤servlet请求响应。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容