用了多年spring mvc 和 spring boot, 也没怎么仔细研究过spring boot的源码和内部的执行流程。主要是spring 太好用,提供了丰富的组件, 他是完全基于接口编程,配置方便, 使用灵活, 基本满足我们开发过程中的大多数需求。但是springboot内部的细节也过于复杂, 没有足够的耐心还真不能完全搞懂。

最近在做一个模块的时候, 花了点儿时间仔细阅读了一下, 也算是对springboot的请求执行流程有了大概的理解。接下来一一介绍下。

spring boot 在启动的时候是以Application 文件为入口, 启动内嵌的tomcat 容器, 并且扫描给定范围内的configurations, beans, components,services, 注册到 applicationContext 上下文中, 默认是单例模式生成这些实例, 并且解析 静态配置文件的内容 当作常量, 也一并加载到服务中。

当一个client 需要请求API 的时候, spring boot 执行流程如下(具体要结合项目中的配置流程, 这里仅根据当前项目的流程介绍)

Tomcat thread 接受到请求调用 apache 中的 ApplicationFilterChain 执行 doFilter 方法 , doFilter 执行internalDoFilter, 此方法依次调用每个 Filter 中的doFilter 方法, 并将ApplicationFilterChain 实例传递给每一个Filter。

接着所有doFIlter 执行完毕, 控制权交回ApplicationFilterChain, 开始调用Servlet, 类型是 DispatcherServlet(org.springframework.web.servlet 下面), spring DispatcherServlet继承 FrameworkServlet, FrameworkServlet 继承 HttpServletBean , HttpServletBean继承 httpServlet, 依次执行 httpServlet: public service方法 -> FrameworkServlet: protected service方法 -> httpServlet: protected service方法 -> FrameworkServlet: doGet(或者其他的doXX方法, 这些doXX 方法被 FrameworkServlet override 了, 所以实际调用的是FrameworkServlet) -> DispatcherServlet: doService -> doDispatch (这个 逻辑最好去debug会理解的比较清楚。)

doDispatch 方法执行拦截器的preHandle, 然后开始调用spring 的核心类RequestMappingHandlerAdapter: handle-> 执行handleInternal 方法->创建 ServletInvocableHandlerMethod 实例(这个实例是方法级别, 即方法返回,实例会被垃圾回收)-> 注入全局的 的HandlerMethodArgumentResolvers , handlerMethodReturnValueHandlers, HttpMessageConvertors, ResponseBodyAdvices 等到ServletInvocableHandlerMethod 对象实例中。

并调用ServletInvocableHandlerMethod: invokeAndHandle 方法, 该方法通过java 反射机制 动态调用目标API 方法 进入相对应具体的controller,并执行 具体的业务逻辑, ResponseEntity 作为 controller 的返回值。

执行完毕 , 控制权返回 到 invokeAndHandle 方法, 接下来选择合适的 HandlerMethodReturnValueHandler 的实现类(HttpEntityMethodProcessor), 执行 handleReturnValue 方法, 首先会判断是否需要对response entity 进行二次处理(ResponseBodyAdvice: beforeBodyWrite), 处理完成后, 调用注册进来的MessageConvertor 对返回信息进行转换处理, 比如使用faster Jackson 把对象类型转成 json 字符串,并以application/json 的形式返回 http response。

此时,控制权转会到 RequestMappingHandlerAdapter, 继续执行完毕, 控制权转回 DispatcherServlet: doDispatch, 执行对应的拦截器 postHandle 方法, 最后执行拦截器的afterCompletion 方法。

控制权转回ApplicationFilterChain , 继续执行Filter 剩下的代码。能够讲的就这么多, 接下来的不属于本次研究范围。

未完待续! 后面会具体介绍每个关键的spring 核心类作用。

springboot单例模式注入对象_springboot 请求流程简介相关推荐

  1. springboot单例模式注入对象_Spring 中经典的 9 种设计模式,打死也要记住啊!

    本文转载自公众号"Java专栏 1.简单工厂(非23种设计模式中的一种) 2.工厂方法 3.单例模式 4.适配器模式 5.装饰器模式 6.代理模式 7.观察者模式 8.策略模式 9.模版方法 ...

  2. springboot 接受数组对象_SpringBoot+RabbitMQ 方式收发消息

    本文来源:juejin.im/post/6859152029823008781 本篇会和SpringBoot做整合,采用自动配置的方式进行开发,我们只需要声明RabbitMQ地址就可以了,关于各种创建 ...

  3. springboot设置空参数_springboot请求参数为空

    一.描述 网站报如下错误 二.分析 1.经排查,是因为将spring.http.multipart.enabled设为false导致的(之所以将该参数改为false,是要解决"无效的服务器端 ...

  4. springboot处理参数再转发请求_Springboot 2.0---WebFlux请求处理流程

    笔记是学习了小马哥在慕课网的课程的<Spring Boot 2.0深度实践之核心技术篇>的内容结合自己的需要和理解做的笔记. 前言 在了解了WebFlux核心组件之后,我们就该了解相应的请 ...

  5. Java-Day12 面向对象的三大特征之封装、继承,单例模式(饿汉式、懒汉式)、方法重写 (覆盖)、注解 (annotation)、super关键字、对象的创建流程超详细

    目录 1. 面向对象的三大特征之封装 1.1 封装的含义 1.2 封装的目的 1.3 封装的优点 1.4 封装的实现过程 1.5 拓展知识:JavaBean 2. 面向对象的三大特征之继承 2.1 继 ...

  6. Springboot 拦截器无法注入对象的解决

    原因: 注册拦截器的时候是new出来的,spring没有管理.所以无法注入对象 @Beanpublic AgentInterceptor agentInterceptor(){return new A ...

  7. 面试官 | SpringBoot 中如何实现异步请求和异步调用?

    作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...

  8. Java 依赖注入标准(JSR-330)简介

    Java 依赖注入标准(JSR-330)简介 转载请保留作者信息: 作者:88250 ,Vanessa 时间:2009 年 11 月 19 日 Java 依赖注入标准(JSR-330,Dependen ...

  9. SpringBoot+Vue+Itext实现前端请求文件流的方式导出PDF时在指定位置添加照片

    场景 SpringBoot+Vue+Itext实现前端请求文件流的方式下载PDF: SpringBoot+Vue+Itext实现前端请求文件流的方式下载PDF_BADAO_LIUMANG_QIZHI的 ...

最新文章

  1. linux文件每行长度,linux – 根据第一列/行中的字符长度对文件进行排序
  2. 剑指offer:面试题10- II. 青蛙跳台阶问题
  3. TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现
  4. VC#2005 Starter Kit: Screen Saver 使用介绍
  5. 简单python脚本实例-30个Python 小例子,帮你快速上手Python
  6. 如何从视频中删除声音?
  7. 利用Python收发邮件
  8. 答答星球微信答题小程序头脑王者源码带后台手机app开发排位pk
  9. C语言获取当前的工作路径
  10. 颜色代码查询,在线颜色选择器,RGB颜色对照表
  11. 远程拨号换IP的方法
  12. 实验五|Python 企业获利能力分析
  13. IBM PureApplication System如何使用DNS将工作负载部署到数据中心的网络上
  14. 无盘服务器快慢取决于什么,cpu运行速度的快慢取决于什么
  15. 具体时间转换cron表达式
  16. 阿里云ECS的1M带宽能干嘛?
  17. 安卓11 Sdcard文件读取权限问题
  18. UVA - 1647 Computer Transformation(计算机变换)(找规律)
  19. 翻译app上的图片文字信息提取好神奇?如何实现一个文字图片识别程序
  20. 北邮计算机学院研究生信息官网,北京邮电大学

热门文章

  1. selenium之 chromedriver与chrome版本映射表(更新至v2.33)
  2. FD_CLOEXEC用法及原因_转
  3. 快点啊,大工程禁用Visual Assist,禁用符号加载
  4. VIJOS国庆节模拟赛之繁星春水
  5. 去除VisualStudio中拼写错误检测的红色波浪线
  6. Qt Creator如何恢复默认布局
  7. 新华社北京4月15日电 题:奋斗应提倡,996当退场
  8. 监控USB设备插入/拔出写法2
  9. php流媒体视频下载,如何使用PHP流媒体文件?
  10. c语言%f小数位第六位是错的,c语言中输出浮点型数据,如果不指定输出位数,%f输出几位小数?...