javascript
【手写系列】写出我的第一个框架:迷你版Spring MVC
你沒有看錯(cuò)標(biāo)題,今天,我將實(shí)現(xiàn)我人生中第一個(gè)框架,^_^
前期準(zhǔn)備
我這里要寫的是一個(gè)迷你版的Spring MVC,我將在一個(gè)干凈的web工程開始開發(fā),不引入Spring,完全通過JDK來實(shí)現(xiàn)。
我們先來看一眼工程:
工程代碼結(jié)構(gòu)?
第一,在annotation包下,我將提供自定義的注解,為了方便理解,就和Spring MVC保持一致。
第二,為了模擬Spring MVC的方法調(diào)用鏈,我這里提供Controller/Service/Dao層進(jìn)行測試
第三,提供自己的DispatcherServlet完成核心處理邏輯
?
關(guān)于自定義注解
JDK提供了幾個(gè)元注解,比如:
@Documented : JavaDoc文檔
@Target:標(biāo)志此注解可以修飾在哪些地方,類,成員變量,方法...
@Retention:Annotation的生命周期,一般情況下,我們自定義注解的話,顯然需要在運(yùn)行期獲取注解的一些信息。
看一下我這邊的自定義注解:
模擬Spring MVC的@Controller注解?
@Qualifier提供依賴注入?
@RequestMapping提供URL地址處理映射?
Dao層注解?
Service層注解?
?
編寫核心控制器:DispatcherServlet
在Spring MVC中,DispatcherServlet是核心,下面我們來實(shí)現(xiàn)它。首先,Spring MVC中的DispatcherServlet說到底,還是HttpServlet的子類,因此我這邊自己的DispatcherSerlvet需要繼承?HttpServlet。
pom.xml:
提供servlet依賴?
看DispatcherServlet的定義:
DispatcherServlet?
@WebServlet是什么?
其實(shí),以前我們定義一個(gè)Servlet,需要在web.xml中去配置,不過在Servlet3.0后出現(xiàn)了基于注解的Servlet。
仔細(xì)觀察,你會發(fā)現(xiàn),這個(gè)DispatcherServlet是自啟動(dòng),而且傳入了一個(gè)參數(shù)。
要知道,在Spring MVC中,要想基于注解,需要在配置中指明掃描的包路徑,就像這個(gè)樣子:
<context:component-scan base-package="com.zfz.myspringmvc">
</context:component-scan>
為了方便,我這里就通過初始化參數(shù)直接將需要掃描的基包路徑傳入。
?
init初始化處理:
init()?
其實(shí),在init中,我們主要是完成了什么呢?
第一,我們應(yīng)該去掃描基包下的類,得到信息A
第二,對于@Controller/@Service/@Repository注解而言,我們需要拿到對應(yīng)的名稱,并初始化它們修飾的類,形成映射關(guān)系B
第三,我們還得掃描類中的字段,如果發(fā)現(xiàn)有@Qualifier的話,我們需要完成注入
第四,我們還需要掃描@RequestMapping,完成URL到某一個(gè)Controller的某一個(gè)方法上的映射關(guān)系C
其實(shí),Spring MVC的處理流程,就是類似這樣的!
?
掃描基包:
掃描基包?
注意,基包是X.Y.Z的形式,而URL是X/Y/Z的形式,需要轉(zhuǎn)換。
實(shí)例化:
實(shí)例化?
從這里你可以看出,我們完成了被注解標(biāo)注的類的實(shí)例化,以及和注解名稱的映射。
依賴注入:
依賴注入?
以前,我們總是說Spring IOC,上面不就是在做這個(gè)事情么?
URL映射處理:
URL映射處理?
URL,我們需要提取出來,映射到Controller的Method上。
doGet/doPost:
doGet/doPost?
在doPost方法中,非常簡單,我們只需要提取出URL,通過URL映射到Method上,然后通過反射的方式進(jìn)行調(diào)用即可。
?
Make it run!
Controller層:
UserController?
Service層:
UserService?
UserServiceImpl?
Dao層:
UserDao?
UserDaoImpl?
運(yùn)行結(jié)果:
result?
OK,到這里,一個(gè)迷你版的Spring MVC就開發(fā)完成了,以前,都是用Spring MVC,從沒有想過可以自己開發(fā)一個(gè)出來,這是我的第一次,我的能量超乎我的想象,哈哈~
?
?
手寫系列相關(guān)爆文
【手寫系列】透徹理解Spring事務(wù)設(shè)計(jì)思想之手寫實(shí)現(xiàn)
【手寫系列】透徹理解MyBatis設(shè)計(jì)思想之手寫實(shí)現(xiàn)
【手寫系列】純手寫實(shí)現(xiàn)一個(gè)高可用的RPC
【手寫系列】理解數(shù)據(jù)庫連接池底層原理之手寫實(shí)現(xiàn)
【手寫系列】對HashMap的思考及手寫實(shí)現(xiàn)
【手寫系列】純手寫實(shí)現(xiàn)JDK動(dòng)態(tài)代理
【手寫系列】寫一個(gè)迷你版的Tomcat
?
作者:張豐哲
鏈接:https://www.jianshu.com/p/f454662f497e
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的【手写系列】写出我的第一个框架:迷你版Spring MVC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微服务化的基石——持续集成
- 下一篇: 【手写系列】纯手写实现JDK动态代理