手写SpringMVC框架

简介: 手写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、基本流程图

20201124164553353.png


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

2、项目结构


20201124170110841.png

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


三、小结


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

目录
相关文章
|
设计模式 前端开发 Java
总结丨Spring 源码学习,看这一篇就够了
在日常工作中,产品不断写业务需求,他们加班一天,我们开发就得工作一周来完成。 业务领域达到一定地步后,发现日常编写业务代码已经很难让我有突破性的进步,日复一日,担心自己变成一个业务代码生产机器,而无法面对新技术和环境变化。 同时也有危机感,长江后浪推前浪,自己不继续学习的话,很快就会有人超过。 而且我算是比较热心的好同学,喜欢帮别人解决问题和记录解决方案,所以不希望在别人问我工作中有什么常用的框架,遇到这个问题该怎么办,我却回答不上的感觉
7576 1
总结丨Spring 源码学习,看这一篇就够了
|
数据可视化 数据挖掘
使用R语言进行多维缩放分析
【4月更文挑战第27天】本文介绍了R语言中的多维缩放分析(MDS)技术,用于高维数据的可视化。MDS通过映射数据点到低维空间保持距离或相似性,帮助理解数据结构。R中的`cmdscale`和`isoMDS`函数可用于构建MDS模型,而`dist`计算距离矩阵。通过实例展示了如何分析消费者对品牌评价,`stressplot`和`procrustes`函数则用于模型解释和验证。R还支持经典MDS、度量MDS和非度量MDS等高级主题,为数据探索提供强大工具。
231 0
|
9月前
|
搜索推荐 数据可视化 视频直播
精准与个性化:数字营销的新篇章
在数字化时代,数字营销已成为企业提升品牌、拓展市场和促进销售的关键手段。2021年,中国数字营销市场规模达1.4万亿元,增长17.9%,显示其巨大潜力。市场多元化,包括搜索引擎、信息流、视频和社交广告等渠道,各具特色。同时,面临消费者注意力分散、隐私保护等挑战,企业需通过精准营销、内容创意和多渠道整合来突出产品优势,实现销售突破。板栗看板作为专业工具,提供数据整合、分析和可视化服务,助力企业优化营销策略。
|
分布式计算 算法 安全
点对点(P2P)模式
点对点(P2P)模式
|
JavaScript 算法 开发工具
Github 2024-07-22 开源项目周报Top15
根据Github Trendings的统计,本周(2024年7月22日统计)共有15个项目上榜。按开发语言分类,上榜项目数量如下:Python项目最多,共7个;TypeScript项目4个;Rust和非开发语言项目各2个;Jupyter Notebook、C#、JavaScript和C++项目各1个。其中,《Hello 算法》是一本开源的数据结构与算法教程,采用动画图解和可运行代码示例,适合初学者。Prisma则为Node.js和TypeScript提供下一代ORM解决方案。其他项目涵盖文本编辑器、富文本编辑器、AI编码助手等多种应用。
233 1
|
前端开发 关系型数据库 MySQL
使用 gin-api-mono 创建简单的 TODO 服务
使用 gin-api-mono 创建简单的 TODO 服务
|
消息中间件 网络协议 网络架构
3. BGP 实验(一):基础实验
3. BGP 实验(一):基础实验
|
Web App开发 安全 网络安全
Chrome您的连接不是私密连接解决办法--一个比较实用的技巧分享
Chrome您的连接不是私密连接解决办法--一个比较实用的技巧分享
548 0
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的螺丝螺母识别算法matlab仿真
以下是内容的摘要: 该文介绍了使用YOLOv2深度学习模型进行螺丝螺母识别的算法,展示了在matlab2022a环境下运行的6张检测效果图。YOLOv2基于Darknet-19预训练网络,结合多任务损失函数和非极大值抑制技术,有效检测目标。为了适应任务,进行了数据集准备、模型微调、锚框选取等步骤。核心程序加载预训练模型,遍历图像并展示检测结果,通过调整阈值绘制检测框。
|
搜索推荐 安全 Linux
Visual Studio Code 提高效率的快捷方式(下)
Visual Studio Code 是目前最流行、最常用的代码编辑器之一,它是开源的并且可以免费使用。它还提供对多种语言和框架的支持。 ​ 注意,这些 Visual Studio Code 快捷方式取自于 VS Code 官方文档。如果某些快捷方式不起作用,可能是由于编辑器或文件格式中的快捷方式发生了变化,或者安装的扩展影响了该快捷方式。
1148 0