你沒有看錯(cuò)標(biāo)題,今天,我將實(shí)現(xiàn)我人生中第一個(gè)框架排龄,^_^
前期準(zhǔn)備
我這里要寫的是一個(gè)迷你版的Spring MVC,我將在一個(gè)干凈的web工程開始開發(fā)翎朱,不引入Spring橄维,完全通過JDK來實(shí)現(xiàn)。
我們先來看一眼工程:
第一拴曲,在annotation包下争舞,我將提供自定義的注解,為了方便理解澈灼,就和Spring MVC保持一致竞川。
第二,為了模擬Spring MVC的方法調(diào)用鏈叁熔,我這里提供Controller/Service/Dao層進(jìn)行測(cè)試
第三委乌,提供自己的DispatcherServlet完成核心處理邏輯
關(guān)于自定義注解
JDK提供了幾個(gè)元注解,比如:
@Documented : JavaDoc文檔
@Target:標(biāo)志此注解可以修飾在哪些地方荣回,類遭贸,成員變量,方法...
@Retention:Annotation的生命周期驹马,一般情況下革砸,我們自定義注解的話除秀,顯然需要在運(yùn)行期獲取注解的一些信息糯累。
看一下我這邊的自定義注解:
編寫核心控制器:DispatcherServlet
在Spring MVC中,DispatcherServlet是核心册踩,下面我們來實(shí)現(xiàn)它泳姐。首先來說,Spring MVC中的DispatcherServlet說到底暂吉,還是HttpServlet的子類胖秒,因此我這邊自己的DispatcherSerlvet需要extends HttpServlet。
pom.xml:
看DispatcherServlet的定義:
@WebServlet是什么慕的?
其實(shí)阎肝,以前我們定義一個(gè)Servlet,需要在web.xml中去配置肮街,不過在Servlet3.0后出現(xiàn)了基于注解的Servlet风题。
仔細(xì)觀察,你會(huì)發(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初始化處理:
其實(shí),在init中肯适,我們主要是完成了什么呢涉茧?
第一,我們應(yīng)該去掃描基包下的類疹娶,得到信息A
第二伴栓,對(duì)于@Controller/@Service/@Repository注解而言,我們需要拿到對(duì)應(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í)例化:
從這里你可以看出,我們完成了被注解標(biāo)注的類的實(shí)例化朱躺,以及和注解名稱的映射刁赖。
依賴注入:
以前,我們總是說Spring IOC长搀,上面不就是在做這個(gè)事情么宇弛?
URL映射處理:
URL,我們需要提取出來源请,映射到Controller的Method上枪芒。
doGet/doPost:
在doPost方法中轿钠,非常簡單,我們只需要提取出URL病苗,通過URL映射到Method上疗垛,然后通過反射的方式進(jìn)行調(diào)用即可。
Make it run硫朦!
Controller層:
Service層:
Dao層:
運(yùn)行結(jié)果:
OK贷腕,到這里,一個(gè)迷你版的Spring MVC就開發(fā)完成了咬展,以前泽裳,都是用Spring MVC,從沒有想過可以自己開發(fā)一個(gè)出來破婆,這是我的第一次涮总,我的能量超乎我的想象,哈哈~