前期準備
我這裡要寫的是一個迷你版的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需要extends HttpServlet。
pom.xml:
提供servlet依賴
看DispatcherServlet的定義:
DispatcherServlet
@WebServlet是什麼?
其實,以前我們定義一個Servlet,需要在web.xml中去配置,不過在Servlet3.0後出現了基於註解的Servlet。
仔細觀察,你會發現,這個DispatcherServlet是自啟動,而且傳入了一個參數。
要知道,在Spring MVC中,要想基於註解,需要在配置中指明掃描的包路徑,就像這個樣子:
<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,從沒有想過可以自己開發一個出來,這是我的第一次,我的能量超乎我的想象,哈哈~
在此我向大家推薦一個架構資料,馬士兵JVM精講視頻,威信,an_sheng975裡面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多
閱讀更多 java互聯網高級架構 的文章