文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206 种一棵树最好的时间是十年前,其次是现在
一个Web后端框架的轮子从处理Http请求【基于Netty的请求级Web服务器】 到mvc【接口封装转发)】,再到ioc【依赖注入】,aop【切面】,再到 rpc【远程过程调用】最后到orm【数据库操作】全部自己撸一个(简易)的轮子。
github
其实是这样的,小六六自己平时呢?有时候喜欢看看人家的源码比如Spring,但是小六六的水平可能不怎么样,每次看都看得晕头转向,然后就感觉里面的细节太难了,然后我就只能观其总体的思想,然后我就想我如果可以根据各位前辈的一些思考,自己撸一个简单的轮子出来,那我后面去理解作者的思想是不是简单点呢?于是呢 six-finger-web就面世了,它其实就是我的一个学习过程,然后我把它开源出来,希望能帮助那些对于学习源码有困难的同学。还有就是可以锻炼一下自己的编码能力,因为平时我们总是crud用的Java api都是那些,久而久之,很多框架类的api我们根本就不熟练了,所以借此机会,锻炼一下。
此教程只适合初中级水平,因为作者本身水平不高,不喜勿喷,今天是文章的第二篇,实现一个简单的SpringMVC,参考的是Guide哥的jsoncat。好了,下面我给大家来一一走一遍搭建流程
这边建议一边下载源码,一边来看,如果觉得有问题的话
首先我们来看看写完了MVC之后的包结构,以至于大家心里有数
首先第一步,我先把pom文件新增的地方给大家看看
引入他们一个是反射,因为写轮子,反射肯定用的多,还有一个就是json转换工具
这边我先把整体的思想给大家捋捋,这个只是一个简单的实现,还有很多的细节没有完成
首先,我们看看我们写业务是个怎么样的样子,如下图
好,这个就是我们最终要做到的效果,对吧,那我们浏览器请求的时候长什么样呢?
它长这样,那其实久很清晰了,SpringMVC要实现的就是不同请求走不同的方法嘛,这就是核心思想嘛。总的来说其实就三个部分
下面,我一一来讲解
这边我解题然后把找类 方法的流程给大家,大家自己去看源码
HttpRequestHandler->channelRead0
其实服务器这边需要改造的地方也不多,就是通过请求,来找到不同的处理器,然后再去处理我们的业务,然后根据业务的返回值,然后我们再去封装一些成功或者失败,然后这边来看看server包下面的几个类,具体的代码,大家就自己去看了,每个类基本上有注释
首先我们再来看看我们的启动类这边, 类 ApplicationServer
然后我们就可以往下跟代码了,其实大家看源码也是这样,但是源码的话细节毕竟多,所以难懂点
类 DispatcherMethodMapper->loadRoutes
这个类的东西还比较多,基本上很多地方我写了注释,如果不懂的可以私下请教,然后我们大致来分析一下吧!
还是在服务端那个类那跟起 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行左右。