手写SpringMVC框架

引言

在分析springMVC框架之前,我们根据我们对整个框架的流程分析,先来手写一个简易版的springMVC框架, 这样我们在看源码的时候会更清晰,毕竟框架源码还是非常庞大的, 如果我们一行一行的看的话, 那就完蛋了,直接陷到里面出不来了。所以本篇 博客我们基于现有的servlet和spring框架来手写模拟一个springMVC框架,在这个框架中我们主要是编写主流程,也就是我们最关系的处理器和适配器等。

一、实现分析

我们在动手之前,首先需要分析一下, springmvc框架到底帮我们做了什么功能,是如何实现的?

1、使用内嵌的tomcat作为servlet容器

2、采用spring IOC容器,将处理器扫描到容器中,并且通过spring的后置处理器 取出处理。(处理器:做业务处理的组件,可以使类后者方法,处理器和url存在映射关系)

注:这里我们需要清楚,@Controller注解是spring提供的,如果我们仅仅添加了这个注解,此时这个类只是一个普通的bean,并不是一个处理器,和@component是一样的。

3、@RequestMapping 是SpringMVC的框架的,所以需要我们自己实现这个注解。

其实核心实现方式,就是我们维护一个Map<url,处理器(Object)>,因为处理器可能是一个类、或者方法等,所以需要object类型。根据前端请求的url找到对应的处理器,然后执行对应的处理逻辑方法。

4、springmvc处理器类型:

1)直接使用@Controller注解搭配@RequestMapping(url)注解来实现处理器,由于我们每个方法 上面都可以使用@RequestMapping注解,所以我们需要通过反射获得对应方法并执行。

2)实现servle接口,获得对应的处理器以后,直接执行service方法

3)实现Controller ,获得对应的处理器以后, 直接执行handleRequest()方法

4)实现HttpRequestHandler,获得对应的处理器以后, 直接执行handleRequest()方法

为什么会有多种实现处理器的方式呢,这是由于历史发展的原因,我们都知道在最开始的时候,我们都是自己实现servlet接口来编程的,所以作为一个成熟的框架当然不能抛弃最原始的功能,所以在springmvc内部实现了多种实现方式。既然有多种处理方式需要我们兼容,所以我们需要判断我们使用哪种控制器以后,才能执行对应的实现逻辑。所以这里为了易于代码的扩展,这里需要适配器模式,给每一种处理都实现一个对应的适配器,具体参考上一篇博客《从SpringMVC看适配器模式》  。

5、适配器:跟映射器一一对应

  提供一个统一的接口

  判断适配是否成功

  执行处理逻辑接口

6、返回参数json,使用@responseBoday注解

7、参数绑定 ,使用@RequestParam注解实现参数绑定

 那么这里各位小可爱又会发现一个问题,就是我们平常在使用的时候,很多情况下我们都没有使用这个注解,我们参数也可以正常注入,这是为什么呢?

在JDK1.8之前,这是采用了ASM(字节码技术),通过class文件解析参数,那是因为在jdk1.8之前我们通过反射不能获得参数名称。但是在jdk1.8开始,我们就不在采用asm技术,因为我们可以通过反射获得参数名称了。所以我们在平常使用的时候,如果从性能方面考虑,我们还是需要@RequestParam参数,这样我们更快的完成参数注入。

二、代码实现

以上呢就是我们手写springmvc 容器,需要实现和考虑的问题,下面我们就动手写代码了,先来看代码执行流程

1、基本流程图

 

原图地址:https://www.processon.com/view/link/5fbcbabd5653bb1d54f57e4c

 2、项目结构

         

 

3、项目地址:https://github.com/good-jack/self-springmvc

三、小结

大家可以根据流程图,自己在本地起来项目debug几遍流程,就会明白很多,本文没有贴出来代码,是因为代码的每个类都比较简单,但是类比较多,不太好分析,所以需要将代码下载到本地自行调试。在这个项目中我们仅仅实现了springmvc的核心流程及两种实现控制器的方式。当我们理解了这个简易的springmvc框架后,对后面分析真正的springmvc框架源码会有一定的好处。  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
手写Spring MVC是指自己实现一个简单的Spring MVC框架,而不是使用官方提供的Spring MVC框架。在手写Spring MVC时,你需要实现以下几个关键部分: 1. 创建一个前端控制器(Front Controller):前端控制器是整个请求处理过程的入口点,负责接收请求并进行路由。你可以使用Servlet作为前端控制器,接收所有的HTTP请求,并将它们分发给相应的控制器。 2. 定义控制器类:控制器类负责处理特定URL的请求,并根据请求参数进行相应的处理。你可以使用注解(如@RequestMapping)来定义控制器类和方法的映射关系。 3. 实现视图解析器(View Resolver):视图解析器负责解析控制器返回的逻辑视图名,并将其转换为具体的视图对象或视图模板。你可以使用模板引擎(如Thymeleaf、Freemarker等)来渲染动态内容。 4. 注册控制器和视图解析器:在前端控制器中,你需要注册所有的控制器类和视图解析器,以便能够正确地处理请求和渲染视图。 5. 处理请求和响应:在控制器中,你需要编写相应的方法来处理请求,并根据业务逻辑生成响应。你可以使用HttpServletRequest和HttpServletResponse对象来访问请求参数和生成响应。 6. 配置URL映射:你需要在配置文件中配置URL与控制器方法的映射关系,以便能够正确地将请求分发给对应的控制器。 手写Spring MVC的过程可以帮助你更好地理解Spring MVC框架的工作原理和核心组件。但请注意,手写一个完整的Spring MVC框架可能会比较繁琐和复杂,特别是对于初学者来说。因此,如果你只是想学习Spring MVC的基本原理和用法,我建议你先阅读官方文档或参考一些教程来快速入门。如果你确实有兴趣手写Spring MVC,你可以参考引用中的博客文章,里面提供了一个手写Spring MVC框架的实现示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [手写 springmvc](https://download.csdn.net/download/knight_black_bob/10207699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringMvc手写简单实现篇 - MVC完结篇](https://blog.csdn.net/qq_35551875/article/details/121811048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g-Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值