[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)

简介: 前言文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206种一棵树最好的时间是十年前,其次是现在

six-finger-web


一个Web后端框架的轮子从处理Http请求【基于Netty的请求级Web服务器】 到mvc【接口封装转发)】,再到ioc【依赖注入】,aop【切面】,再到 rpc【远程过程调用】最后到orm【数据库操作】全部自己撸一个(简易)的轮子。

github


为啥要写这个轮子

其实是这样的,小六六自己平时呢?有时候喜欢看看人家的源码比如Spring,但是小六六的水平可能不怎么样,每次看都看得晕头转向,然后就感觉里面的细节太难了,然后我就只能观其总体的思想,然后我就想我如果可以根据各位前辈的一些思考,自己撸一个简单的轮子出来,那我后面去理解作者的思想是不是简单点呢?于是呢 six-finger-web就面世了,它其实就是我的一个学习过程,然后我把它开源出来,希望能帮助那些对于学习源码有困难的同学。还有就是可以锻炼一下自己的编码能力,因为平时我们总是crud用的Java api都是那些,久而久之,很多框架类的api我们根本就不熟练了,所以借此机会,锻炼一下。


特点

  • 内置由 Netty 编写 HTTP 服务器,无需额外依赖 Tomcat 之类的 web 服务(刚好小六六把Netty系列写完,顺便用下)
  • 代码简单易懂(小六六自己写不出框架大佬那种高类聚,低耦合的代码),能力稍微强一点看代码就能懂,弱点的也没关系,小六六有配套的从0搭建教程。
  • 支持MVC相关的注解确保和SpringMVC的用法类似
  • 支持Spring IOC 和Aop相关功能
  • 支持类似于Mybatis相关功能
  • 支持类似于Dubbo的rpc相关功能
  • 对于数据返回,只支持Json格式


絮叨


此教程只适合初中级水平,因为作者本身水平不高,不喜勿喷,今天是文章的第二篇,实现一个简单的SpringMVC,参考的是Guide哥的jsoncat。 好了,下面我给大家来一一走一遍搭建流程

这边建议一边下载源码,一边来看,如果觉得有问题的话


总结的包结构


首先我们来看看写完了MVC之后的包结构,以至于大家心里有数

网络异常,图片无法展示
|


pom的修改

首先第一步,我先把pom文件新增的地方给大家看看

网络异常,图片无法展示
|


引入他们一个是反射,因为写轮子,反射肯定用的多,还有一个就是json转换工具


具体MVC的实现

这边我先把整体的思想给大家捋捋,这个只是一个简单的实现,还有很多的细节没有完成

首先,我们看看我们写业务是个怎么样的样子,如下图

网络异常,图片无法展示
|


好,这个就是我们最终要做到的效果,对吧,那我们浏览器请求的时候长什么样呢?

网络异常,图片无法展示
|

它长这样,那其实久很清晰了,SpringMVC要实现的就是不同请求走不同的方法嘛,这就是核心思想嘛。总的来说其实就三个部分

  • 一个是原有的server的改造
  • 一个是springmvc相关容器组件的初始化
  • 一个是http请求的请求流程处理


下面,我一一来讲解


改造Netty服务器的请求部分

这边我解题然后把找类 方法的流程给大家,大家自己去看源码

HttpRequestHandler->channelRead0

网络异常,图片无法展示
|


其实服务器这边需要改造的地方也不多,就是通过请求,来找到不同的处理器,然后再去处理我们的业务,然后根据业务的返回值,然后我们再去封装一些成功或者失败,然后这边来看看server包下面的几个类,具体的代码,大家就自己去看了,每个类基本上有注释

网络异常,图片无法展示
|


springmvc相关组件的初始化

首先我们再来看看我们的启动类这边, 类 ApplicationServer

网络异常,图片无法展示
|


然后我们就可以往下跟代码了,其实大家看源码也是这样,但是源码的话细节毕竟多,所以难懂点

类 DispatcherMethodMapper->loadRoutes

网络异常,图片无法展示
|


这个类的东西还比较多,基本上很多地方我写了注释,如果不懂的可以私下请教,然后我们大致来分析一下吧!

  • 第一个肯定是加载包的扫描路径,因为我这个是基于注解的,我就在配置文件中配置扫描路径
    网络异常,图片无法展示
    |

  • 之后就是遍历里面的.class文件,然后找到类上面的注解,如果有RestController 说明他这个类是用来处理请求的,然后遍历类中的方法,然后去一个个分析 PostMapping RequestMapping GetMapping 反正也就是if else 然后把这些方法,把请求的url封装到一个springmvc的容器中,等请求来的时候,就去容器中匹配,然后找到对应的方法,再填充对应的参数,就可以执行方法了,具体的呢?建议大家跟着源码来看哈


之后便是我们的主流程了,我们来看看主题流程怎么走的

还是在服务端那个类那跟起 HttpRequestHandler->channelRead0

我们来看这个方法中的

网络异常,图片无法展示
|
RequestHandlerFactory->create
网络异常,图片无法展示
|
其实就是根据不同的请求方式,找到对应的处理类

然后我们接下去看 HttpRequestHandler->channelRead0

网络异常,图片无法展示
|

然后大家看,这个方法,才是我们的重头戏,也就是我们处理的核心了,我们往下跟 RequestHandler 发现是一个接口

网络异常,图片无法展示
|


假设我们是Get请求找到他的实现类

GetRequestHandler->handle 这个就是我们真正要看的逻辑所在了,我们往下看

网络异常,图片无法展示
|

封装请求参数和路径参数

DispatcherMethodMapper->getMethodDetail

网络异常,图片无法展示
|


MethodDetail->build

网络异常,图片无法展示
|

这个就是核心填充的方法了,当填充完成之后我们会获得一个对象,这个对象就比较厉害了,他包含,当前要执行的方法 请求参数等,如下图 GetRequestHandler->handle

网络异常,图片无法展示
|


接着往下

网络异常,图片无法展示
|


我们来看下,里面的核心方法 ParameterResolver->resolve

网络异常,图片无法展示
|

根据不同的方式去填充,然后填充完成之后呢

网络异常,图片无法展示
|


通过反射去拿到当前要执行的对象,然后再通过反射去执行对应的方法,至此mvc的所有流程走完了


我们看看请求的结果


要执行的RestController

网络异常,图片无法展示
|
网络异常,图片无法展示
|


请求 http://localhost:8081/user/小六六写MVC

网络异常,图片无法展示
|


结尾


好了,我们把MVC的小小流程写完了,代码也上传了,希望大家好好学习,一起加油,后面就要撸ioc 和aop了。大家记得把代码拿下来跟,然后打个断点跑跑,代码不多十多个类而已,每个类平均也就100行左右。

相关文章
|
6天前
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
|
5天前
|
关系型数据库 分布式数据库 数据库
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
PolarDB分布式版助力《香肠派对》实现百亿好友关系20万QPS的毫秒级查询。
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
|
6天前
|
消息中间件 Cloud Native Serverless
RocketMQ 事件驱动:云时代的事件驱动有啥不同?
本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。
115028 1
|
7天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101798 1
|
6天前
|
自然语言处理 Cloud Native Serverless
通义灵码牵手阿里云函数计算 FC ,打造智能编码新体验
近日,通义灵码正式进驻函数计算 FC WebIDE,让使用函数计算产品的开发者在其熟悉的云端集成开发环境中,无需再次登录即可使用通义灵码的智能编程能力,实现开发效率与代码质量的双重提升。
95381 2
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
112727 12
|
11天前
|
SQL 存储 JSON
Flink+Paimon+Hologres 构建实时湖仓数据分析
本文整理自阿里云高级专家喻良,在 Flink Forward Asia 2023 主会场的分享。
71304 1
Flink+Paimon+Hologres 构建实时湖仓数据分析
|
15天前
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151041 4
|
14天前
|
监控 负载均衡 Java
深入探究Java微服务架构:Spring Cloud概论
**摘要:** 本文深入探讨了Java微服务架构中的Spring Cloud,解释了微服务架构如何解决传统单体架构的局限性,如松耦合、独立部署、可伸缩性和容错性。Spring Cloud作为一个基于Spring Boot的开源框架,提供了服务注册与发现、负载均衡、断路器、配置中心、API网关等组件,简化了微服务的开发、部署和管理。文章详细介绍了Spring Cloud的核心模块,如Eureka、Ribbon、Hystrix、Config、Zuul和Sleuth,并通过一个电商微服务系统的实战案例展示了如何使用Spring Cloud构建微服务应用。
103516 9
|
14天前
|
Java 数据处理 调度
更高效准确的数据库内部任务调度实践,阿里云数据库SelectDB 内核 Apache Doris 内置 Job Scheduler 的实现与应用
Apache Doris 2.1 引入了内置的 Job Scheduler,旨在解决依赖外部调度系统的问题,提供秒级精确的定时任务管理。