Spring源码解析系列:Spring Web 请求初探

本文探讨了Spring Web请求的处理流程,从NioEndpoint的监听入口,经过Http11Processor的Request和Response处理,再到Valve和Filter的职责链模式,接着在DispatcherServlet中定位请求路径与Controller方法,最后在InvocableHandlerMethod中通过反射调用处理方法。通过源码分析,揭示了Spring Web请求处理的全貌。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring源码解析系列:Spring Web 请求初探


简介

这几年工作中大部分时间都与SpringWeb打交道,前几年源码阅读能力和方法论不行,在疫情期间学习了一波,有了源码阅读与分析能力,目前也有了一些闲暇时间,以目前自己的水平去写写Spring相关的源码解析

本篇文章就先简单热个身,看看一个请求是如何处理到达我们平时写的Controllers里面的

准备工作

准备工作较为简单,我们使用 spring initializr,搭建一个初始工程,写一个简单的HelloWorld

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorld {
   
   

    @GetMapping("/")
    public String helloWorld() {
   
   
        return "Hello world";
    }
}

推荐IDEA上一个比较好用的插件:RestfulTool和RestfulToolKit

启动项目后,会读取所有的请求列表,简单快捷的发起一个请求:

IDEA推荐SpringWeb插件.png

这样,本章的初步环境就搭建好了,下面开始源码分析:

源码解析

我们直接在新增的HelloWorld类的:

return "Hello world"; 

这行打断点,直接发起请求,可以看到下面的调用栈:

调试调用栈.png

我们从下网上,大体的点击进去,看看大意

带着问题去看:

  • 从那接收的请求:如何写过相关网络编程的,那就会想到起码有一个Netty之类的服务,监听在指定端口,接收请求
  • 接收到的请求如何找到我们写的页面代码(HelloWorld):比如如何将请求路径和处理函数进行对应

一个简单的本地探索的请求如下:

Springweb初探.png

找到大致的监听入口

我们从下往上看是,发现有一个类:NioEndpoint.java,虽然看不太懂更多的细节,但知道有这么一个东西即可

找到重要的Request和Response处理函数

我们继续来到一个重要的类:Http11Processor.java,其中有添加Filter相关的代码,还是明显的Request和Response的处理

这里我们留下两个疑问,目前我们先把请求路径梳理下,这些细节日后我们再回过头来啃它

  • 这个类中设置的Filter如何使用
  • Request和Response是如何转化得到的
public class Http11Processor extends AbstractProcessor {
   
   
    @Override
    public SocketState service(SocketWrapperBase<?> socketWrapper)
        throws IOException {
   
   
        RequestInfo rp = request.getRequestProcessor();
        rp.setStage(org.apache.coyote.Constants.STAGE_PARSE);

        // Setting up the I/O
        setSocketWrapper(socketWrapper);

        // Flags
        keepAlive = true;
        openSocket = false;
        readComplete = true;
        boolean keptAlive = false;
        SendfileState sendfileState = SendfileState
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值