IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot源码学习四——MVC主流程下 -> 正文阅读

[Java知识库]SpringBoot源码学习四——MVC主流程下

一、处理请求

MVC主流程上接上文,DispatcherServlet加载完成之后,它的url-pattern是"/",会匹配所有请求,但是优先级最低。基本上动态资源的请求都会被它处理。

1.1 HandlerMapping

DispatcherServlet收到请求之后会调用HandlerMapping,HandlerMapping根据请求的url找到具体的处理方法,然后将处理方法拦截器链封装成处理器对象,返回给DispatcherServlet。

1.1.1 HandlerMapping装配

HandlerMapping在WebMvcAutoConfiguration里面完成装配
在这里插入图片描述
最重要的处理映射器是RequestMappingHandlerMapping
在这里插入图片描述
它里面保存了@RequestMapping解析之后的路由与方法的关系,但是此时还没有解析@RequestMapping到MappingRegistry(RequestMappingHandlerMapping持有的对象里面维护了处理请求的方法映射)。

1.1.2 解析@RequestMapping生成Url-Method

继续找到MappingRegistry的注册方法,断点看下
在这里插入图片描述
看这个调用链,RequestMappingHandlerMapping是实现了InitializingBean的,在Bean的初始化过程属性注入之后中会调用afterPropertiesSet方法,@RequestMapping解析成RequestMappingInfo,添加到了MappingRegistry。找一下@RequestMapping解析的地方
在这里插入图片描述
这里判断了是否包含处理方法(即处理前端请求的方法)
在这里插入图片描述
还是在RequestMappingHandlerMapping里面的isHandler,判断了是否包含@Controller或者@RequestMapping。继续往下

detectHandlerMethods(beanName);–>return getMappingForMethod(method, userType);–>RequestMappingInfo info = createRequestMappingInfo(method);
在这里插入图片描述

Controller的方法中如果没有@RequestMapping,返回的RequestMappingInfo就是null,也就没有url-method的映射关系
在这里插入图片描述
注册之后就得到了url-method的映射。

1.1.3 HandlerMapping交给DispatchServlet

前面提到,DispatchServlet第一次处理请求时会调用init方法,里面有调用了initHandlerMappings,它里面把前面创建的RequestMappingHandlerMapping以及其他的HandlerMapping,放入了DispatchServlet
在这里插入图片描述
从容器取出H包装andlerMapping,交给handlerMappings。

1.1.4 包装处理方法和拦截器链

根据servlet生命周期,请求经过层层过滤器之后先交给service,判断doGet/doPost,在DispatchServlet会交给doService,再到doDispatch,看下调用链
在这里插入图片描述
找到mappedHandler = getHandler(processedRequest);
在这里插入图片描述
遍历handlerMappings,RequestMappingHandlerMapping的优先级最高
在这里插入图片描述
返回之后得到了处理器mappedHandler,里面的handler就是处理方法,interceptorList就是拦截器链。

1.2 HandlerAdapter

DispatchServlet调用HandlerAdapter来处理前面获取的mappedHandler,HandlerAdapter执行完成里面的handler返回ModelAndView。

1.2.1 HandlerAdapter装配

HandlerAdapter装配也是在WebMvcAutoConfiguration完成
在这里插入图片描述

RequestMappingHandlerAdapter adapter = super.requestMappingHandlerAdapter(contentNegotiationManager,
conversionService, validator);–>adapter.setMessageConverters(getMessageConverters());–>addDefaultHttpMessageConverters(this.messageConverters);

在这里插入图片描述
在这里设置了默认的消息转换器,消息转换器用来转换Controller里面处理方法的参数和返回值。

  • 将请求参数转换成方法参数需要的java类型(josn–>java)
  • 将返回的java类型转换成响应值(java–>json)

1.2.2 获取对应的HandlerAdapter

跟代码

doDispatch–>HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

在这里插入图片描述
有4个默认的HandlerAdapter,根据名称猜到应该是第一个RequestMapping开头的来处理,进入supports看看
在这里插入图片描述
RequestMappingHandlerAdapter用于处理HandlerMethod,返回到doDispatch
ha就是RequestMappingHandlerAdapter类型,持有10个消息转换器,默认采用MappingJackson2HttpMessageConverter进行JSON转换。

1.2.3 拦截器前置方法

进入mappedHandler.applyPreHandle(processedRequest, response)
在这里插入图片描述
这里执行拦截器的preHandler方法,假如preHandler返回false,applyPreHandle就返回false,再返回到doDispatch就直接return了。说明拦截器返回false,请求就会终止处理

1.2.4 执行处理方法

进入

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());–>handleInternal(request, response, (HandlerMethod) handler);–>mav = invokeHandlerMethod(request, response, handlerMethod);

在这里插入图片描述
mav 就是返回的ModelAndView,继续跟代码

invocableMethod.invokeAndHandle(webRequest, mavContainer);–>Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);–>doInvoke(args);–>return method.invoke(getBean(), args);

在这里插入图片描述
执行到 处理方法,返回了字符串"hello!"

1.2.5 匹配@ResponseBody包装返回值

返回到invokeAndHandle
在这里插入图片描述
进入

this.returnValueHandlers.handleReturnValue(
returnValue, getReturnValueType(returnValue), mavContainer, webRequest);–>HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);

在这里插入图片描述
这里有15个返回值处理器,一一匹配
在这里插入图片描述
HelloController上面有@ResponseBody注解,被RequestResponseBodyMethodProcessor匹配到了,回到handleReturnValue,进入

handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);–>writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);

在这里插入图片描述
注意:body = getAdvice().beforeBodyWrite,这是一个扩展点,可以将body封装到自定义的统一返回Bean里面。
这里请求的接口返回Blog对象,匹配到MappingJackson2HttpMessageConverter进行转换,继续跟进

genericConverter.write(body, targetType, selectedMediaType, outputMessage);–>writeInternal(t, type, outputMessage);

在这里插入图片描述
objectWriter.writeValue(generator, value);将返回值转换成JSON字符串,再转换成Byte数组放进generator,返回到writeWithMessageConverters
在这里插入图片描述
结果被封装进了Respone,返回到doDispatch
在这里插入图片描述
HttpServletResponse持有的Respone就是上面那个。得到的mv是null,原因是注解了@ResponseBody的方法,返回值被封装到Respone,不会当作ModelAndView处理

1.3 ViewReslover

采用SpringBoot微服务架构,基本上都是前后端分离的,所有的接口都加了@ResponseBody,不需要后端去做页面跳转,ViewReslover就用不上了,这块就不讲了,代码这里进入

doDispatch–>processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);–>render(mv, request, response);–>view = resolveViewName(viewName, mv.getModelInternal(), locale, request);

二、过滤器与拦截器

过滤器由Servlet容器提供支持,需实现Tomcat提供的Filter接口,拦截器由IOC容器提供支持,需实现Spring提供的HandlerInterceptor接口。请求先到达Servlet容器,再转交给IOC容器,因此执行顺序是先过滤器再拦截器。IOC容器和Servlet容器在启动过程中都会触发监听事件,所以监听器在服务启动时就执行了。最终顺序监听器–>过滤器–>拦截器

三、总结

梳理下总体的工作流程
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 18:51:47  更:2022-06-29 18:52:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:14:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码