前言
文本已收錄至我的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了。
日常求贊
好了各位,以上就是這篇文章的全部內容了,能看到這里的人呀,都是真粉。創作不易,各位的支持和認可,就是我創作的最大動力,我們下篇文章
六脈神劍 | 文 【原創】如果本篇博客有任何錯誤,請批評指教,不勝感激 !