SpringBoot源码——请求全过程源码分析——一步一步详细分析


前言

作为java开发,经常使用SpringBoot框架,那么掌握SpringBoot的请求的全流程还是十分必要的。

没有研究源码之前,有一些疑问:

  • 为什么要返回json串的时候需要在方法上加@ResponseBody,或者在类上加@RestController
  • 为什么返回String类型,不加@ResponseBody,就是要去找视图解析器
  • 返回modelAndVIew类型并加@ResponseBody,那返回的json串,还是页面呢
  • 视图解析器可以有多个吗,如何选择的?加了@ResponseBody之后,还会经过视图解析器处理吗
  • 为什么有时候使用了fastjson,最好也需要加fastjson的消息处理器HttpMessageConverters
  • 若加上方法上加@RequestMapping("/index.html"),且resoure目录下的static目录也有一个index.html页面会怎么样

其实还有很多其他疑问,为什么会这样,其实很重要的一点就是,现在的开发推荐:约定大于配置,配置大于编码。

很多东西已经约定好的,直接告诉我们就这样子,按照这样写就对了,或者很多starter的使用,只要在yaml配置一下就可以了,对于编码的要求较少。那么因为框架或者工具等编码较少,我们就不知道这些框架本来的逻辑。有疑问就很自然了。


一、SpringBoot源码

SpringBoot源码分析是十分必要的,包括但不限于

  • 包括启动类上的注解@SpringBootApplication就是一个很重要的知识点
  • 另外main方法的运行之后,源码里new SpringApplication(primarySources).run(args); ,这里有2个很重要的操作,分别是new和run,分析里面的源码可以看到spring.factories文件里自动配置类加载,各种解析器,拦截器,bean的定义,加载和创建等操作。
  • 还有就是一个前端的get/post请求到controller方法经历了什么。

这次我就先分析第三个,看看一次请求经历了什么。
另外一篇文字是基本分析,有兴趣可以看看SpringMVC源码——doDispatch方法源码分析

二、代码准备

1、请求

下面以返回json格式为例

get请求入参

http://localhost:8080/spring/dataBinder?age=1&name=demoData

返回参数
{
“age”: 1,
“name”: “demoData”
}

2、controller层
@Controller
@RequestMapping("/spring")
@Slf4j
public class SpringController {
   
    @GetMapping("/dataBinder")
    @ApiOperation(value = "我是一个可爱的测试获取dataBinder的接口")
    @ResponseBody
    public DataBinder dataBinder(DataBinder dataBinder) {
   
        return dataBinder;
    }
}
@Data
class DataBinder {
   
    String name;
    Integer age;
}
3、分析起点

分析开始点org.springframework.web.servlet.DispatcherServlet#doDispatch
该方法protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception是请求的必经之路。因为DispatcherServlet本身就一个servlet,它配置的匹配映射地址是 / 。在springboot中它是默认配置好了,在springmvc中,我们可以在web.xml文件中看到它的配置如下:

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值