从源码入手分析SpringMVC的原理

本文详细介绍了SpringMVC的请求处理流程,从DispatcherServlet的doService()开始,逐步剖析doDispatch()、getHandler()和processDispatchResult()等关键方法,揭示了请求如何映射到控制器方法,再到结果处理的全过程。
摘要由CSDN通过智能技术生成

概述

SpringMVC作为控制层框架,具体的作用就不在此赘述了,本文主要针对其处理请求流程的原理来做一次较为细致的讲解

首先来看经典的MVC的三层架构,下面是一个模拟请求的调用和返回,我们把重点放在中间的控制层:例1
SpringMVC就是用于管理这一层,负责将视图层发来的请求发送给下一层,然后再将结果返回,听起来很简单,但是真的这么简单吗?接下来,我们就来渐进式的分析,来研究其工作的原理

准备工作

首先我们选用的是springboot的2.1.4发布版,查看一下依赖树,发现springmvc的版本是5.1.6的版本,正好可以和现在网络上大部分针对3.x版本的源码讲解做一个比较
例2
这里为了不做多余的功夫,一切从简,就只添加了以下的类:
例3
具体的类信息如下

@RestController
public class DemoController {
   

    private final DemoService demoService;

    public DemoController(DemoService demoService) {
   
        this.demoService = demoService;
    }

    @RequestMapping("hi")
    public String sayHi() {
   
        return demoService.getInfo();
    }
}
@Service
public class DemoService {
   

    public String getInfo() {
   
        return "Hello World...";
    }
}

我们启动测试一下:
例4
一切正常,接下来我们就要开始着手分析

工作原理

从刚才的测试我们会发现,我们发送了一个请求(url)给springmvc,然后springmvc就执行了我们定义的sayHi()方法,接着我们的浏览器就收到了响应,这个过程究竟是怎么实现的呢?别急,我们在sayHi()方法处打上断点,进入调试模式

我们依然发起localhost:8080/hi这个请求,程序停在了断点位置,同时也得到了一条调用链。我们沿着调用链从启动位置向上找,我们忽略所有core包下的内容,只找web包下的类,发现请求经过HttpServlet层层封装,最终交给了一个叫DispatcherServlet的类来处理

DispatcherServlet – doService()

这个DispatcherServlet内部有一个doService方法,我们就以此作为起点,来分析这个请求的过程是怎么样的

	protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
		logRequest(request);

		// 保留属性快照,以便恢复
		Map<String, Object> attributesSnapshot = null;
		if (WebUtils.isIncludeRequest(request)) {
   
			attributesSnapshot = new HashMap<>();
			Enumeration<?> attrNames = request.getAttributeNames();
			while (attrNames.hasMoreElements()) {
   
				String attrName = (String) attrNames.nextElement();
				if (this
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值