日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【手写系列】写出我的第一个框架:迷你版Spring MVC

發布時間:2025/3/21 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【手写系列】写出我的第一个框架:迷你版Spring MVC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

你沒有看錯標題,今天,我將實現我人生中第一個框架,^_^

前期準備

我這里要寫的是一個迷你版的Spring MVC,我將在一個干凈的web工程開始開發,不引入Spring,完全通過JDK來實現。

我們先來看一眼工程:

工程代碼結構

?

第一,在annotation包下,我將提供自定義的注解,為了方便理解,就和Spring MVC保持一致。

第二,為了模擬Spring MVC的方法調用鏈,我這里提供Controller/Service/Dao層進行測試

第三,提供自己的DispatcherServlet完成核心處理邏輯

?

關于自定義注解

JDK提供了幾個元注解,比如:

@Documented : JavaDoc文檔

@Target:標志此注解可以修飾在哪些地方,類,成員變量,方法...

@Retention:Annotation的生命周期,一般情況下,我們自定義注解的話,顯然需要在運行期獲取注解的一些信息。

看一下我這邊的自定義注解:

模擬Spring MVC的@Controller注解

?

@Qualifier提供依賴注入

?

@RequestMapping提供URL地址處理映射

?

Dao層注解

?

Service層注解

?

?

編寫核心控制器:DispatcherServlet

在Spring MVC中,DispatcherServlet是核心,下面我們來實現它。首先,Spring MVC中的DispatcherServlet說到底,還是HttpServlet的子類,因此我這邊自己的DispatcherSerlvet需要繼承?HttpServlet。

pom.xml:

提供servlet依賴

?

看DispatcherServlet的定義:

DispatcherServlet

?

@WebServlet是什么?

其實,以前我們定義一個Servlet,需要在web.xml中去配置,不過在Servlet3.0后出現了基于注解的Servlet。

仔細觀察,你會發現,這個DispatcherServlet是自啟動,而且傳入了一個參數。

要知道,在Spring MVC中,要想基于注解,需要在配置中指明掃描的包路徑,就像這個樣子:

<context:component-scan base-package="com.zfz.myspringmvc">

</context:component-scan>

為了方便,我這里就通過初始化參數直接將需要掃描的基包路徑傳入。

?

init初始化處理:

init()

?

其實,在init中,我們主要是完成了什么呢?

第一,我們應該去掃描基包下的類,得到信息A

第二,對于@Controller/@Service/@Repository注解而言,我們需要拿到對應的名稱,并初始化它們修飾的類,形成映射關系B

第三,我們還得掃描類中的字段,如果發現有@Qualifier的話,我們需要完成注入

第四,我們還需要掃描@RequestMapping,完成URL到某一個Controller的某一個方法上的映射關系C

其實,Spring MVC的處理流程,就是類似這樣的!

?

掃描基包:

掃描基包

?

注意,基包是X.Y.Z的形式,而URL是X/Y/Z的形式,需要轉換。

實例化:

實例化

?

從這里你可以看出,我們完成了被注解標注的類的實例化,以及和注解名稱的映射。

依賴注入:

依賴注入

?

以前,我們總是說Spring IOC,上面不就是在做這個事情么?

URL映射處理:

URL映射處理

?

URL,我們需要提取出來,映射到Controller的Method上。

doGet/doPost:

doGet/doPost

?

在doPost方法中,非常簡單,我們只需要提取出URL,通過URL映射到Method上,然后通過反射的方式進行調用即可。

?

Make it run!

Controller層:

UserController

?

Service層:

UserService

?

UserServiceImpl

?

Dao層:

UserDao

?

UserDaoImpl

?

運行結果:

result

?

OK,到這里,一個迷你版的Spring MVC就開發完成了,以前,都是用Spring MVC,從沒有想過可以自己開發一個出來,這是我的第一次,我的能量超乎我的想象,哈哈~

?

?

手寫系列相關爆文


【手寫系列】透徹理解Spring事務設計思想之手寫實現

【手寫系列】透徹理解MyBatis設計思想之手寫實現

【手寫系列】純手寫實現一個高可用的RPC

【手寫系列】理解數據庫連接池底層原理之手寫實現

【手寫系列】對HashMap的思考及手寫實現

【手寫系列】純手寫實現JDK動態代理

【手寫系列】寫一個迷你版的Tomcat

?


作者:張豐哲
鏈接:https://www.jianshu.com/p/f454662f497e
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

總結

以上是生活随笔為你收集整理的【手写系列】写出我的第一个框架:迷你版Spring MVC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。