1小時手寫SpringMVC T5大牛帶你解讀Spring核心原始碼(附詳細視訊教程)
SpringMVC簡介
SpringMVC是當前最優秀的MVC框架,自從Spring 2.5版本釋出後,由於支援註解配置,易用性有了大幅度的提高。Spring 3.0更加完善,實現了對Struts 2的超越。現在越來越多的開發團隊選擇了Spring MVC。
- Spring為展現層提供的基於MVC設計理念的優秀的Web框架,是目前最主流的MVC框架之一
- Spring3.0後全面超越Struts2,成為最優秀的MVC框架
- Spring MVC通過一套MVC註解,讓POJO成為處理請求的控制器,而無須實現任何介面。
- 支援REST風格的URL請求
- 採用了鬆散耦合可插拔元件結構,比其他MVC框架更具擴充套件性和靈活性
SpringMVC執行流程

在開始之前,想提幾個問題讓大家思考一下:
1. 為什麼要手寫SpringMVC?
2. 如何手寫一個SpringMVC?
3. 手寫的SpringMVC真的可以跑起來嗎?
話不多說,直接進入正題
1小時手寫SpringMVC T5大牛帶你解讀Spring核心原始碼(附詳細視訊教程)
講師簡介

- 1,3分鐘讀懂Spring核心原始碼;
- 2,SpringMVC與Spring框架關係;
- 3,SpringMVC的所有註解定義實戰;
- 4,手寫SpringMVC框架實戰;
- 5,Tomcat載入進行測試實戰;
為什麼讀Spring原始碼

Spring原始碼的核心元件

手寫SpringMVC之前的那些事
1. @Controller, @Service 註解是什麼
2. DispatcherServlet原理與機制
手寫SpringMVC實戰

SpringMVC九大元件
HandlerMapping
是用來查詢Handler的。在SpringMVC中會有很多請求,每個請求都需要一個Handler處理,具體接收到一個請求之後使用哪個Handler進行處理,這就是HandlerMapping需要做的事。
HandlerAdapter
從名字上看,它就是一個介面卡。因為SpringMVC中的Handler可以是任意的形式,只要能處理請求就ok,但是Servlet需要的處理方法的結構卻是固定的,都是以request和response為引數的方法。如何讓固定的Servlet處理方法呼叫靈活的Handler來進行處理呢?這就是HandlerAdapter要做的事情。
小結:Handler是用來幹活的工具;HandlerMapping用於根據需要乾的活找到相應的工具;HandlerAdapter是使用工具幹活的人。
HandlerExceptionResolver
其它元件都是用來幹活的。在幹活的過程中難免會出現問題,出問題後需要有一個專門的角色對異常情況進行處理,在SpringMVC中就是HandlerExceptionResolver。具體來說,此元件的作用是根據異常設定ModelAndView,之後再交給render方法進行渲染。
ViewResolver
ViewResolver用來將String型別的檢視名和Locale解析為View型別的檢視。View是用來渲染頁面的,也就是將程式返回的引數填入模板裡,生成html(也可能是其它型別)檔案。這裡就有兩個關鍵問題:使用哪個模板?用什麼技術(規則)填入引數?這其實是ViewResolver主要要做的工作,ViewResolver需要找到渲染所用的模板和所用的技術(也就是檢視的型別)進行渲染,具體的渲染過程則交由不同的檢視自己完成。
RequestToViewNameTranslator
ViewName是根據ViewName查詢View,但有的Handler處理完後並沒有設定View也沒有設定ViewName,這時就需要從request獲取ViewName了,如何從request中獲取ViewName就是RequestToViewNameTranslator要做的事情了。RequestToViewNameTranslator在Spring MVC容器裡只可以配置一個,所以所有request到ViewName的轉換規則都要在一個Translator裡面全部實現。
LocaleResolver
解析檢視需要兩個引數:一是檢視名,另一個是Locale。檢視名是處理器返回的,Locale是從哪裡來的?這就是LocaleResolver要做的事情。LocaleResolver用於從request解析出Locale,Locale就是zh-cn之類,表示一個區域,有了這個就可以對不同區域的使用者顯示不同的結果。SpringMVC主要有兩個地方用到了Locale:一是ViewResolver檢視解析的時候;二是用到國際化資源或者主題的時候。
ThemeResolver
用於解析主題。SpringMVC中一個主題對應一個properties檔案,裡面存放著跟當前主題相關的所有資源、如圖片、css樣式等。SpringMVC的主題也支援國際化,同一個主題不同區域也可以顯示不同的風格。SpringMVC中跟主題相關的類有 ThemeResolver、ThemeSource和Theme。主題是通過一系列資源來具體體現的,要得到一個主題的資源,首先要得到資源的名稱,這是ThemeResolver的工作。然後通過主題名稱找到對應的主題(可以理解為一個配置)檔案,這是ThemeSource的工作。最後從主題中獲取資源就可以了。
MultipartResolver
用於處理上傳請求。處理方法是將普通的request包裝成MultipartHttpServletRequest,後者可以直接呼叫getFile方法獲取File,如果上傳多個檔案,還可以呼叫getFileMap得到FileName->File結構的Map。此元件中一共有三個方法,作用分別是判斷是不是上傳請求,將request包裝成MultipartHttpServletRequest、處理完後清理上傳過程中產生的臨時資源。
FlashMapManager
用來管理FlashMap的,FlashMap主要用在redirect中傳遞引數。
SpringMVC工程結構與程式碼
該專案最終的工程檔案及目錄如下:
1、新建一個Maven專案,可以設定勾選自動生成web.xml,也可以自己手動新增,在pom.xml中匯入javax.servlet-api,僅需要匯入這一個包就可以啦。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.edu.whu</groupId> <artifactId>SpringMVCByHand</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> </dependencies> </project>
2、在生成的web.xml中配置一個MyDispatcherServlet,用於攔截符合“/”的請求,配置一個myapplication.properties檔案,用於配置需要掃描的包名。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>MyMVC</servlet-name> <servlet-class>cn.edu.whu.MVCByHand.servlet.MyDispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>myapplication.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyMVC</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
總結
由於文章篇幅原因,詳細過程就不一一展示了,需要更詳細視訊資料和思維導圖的可以加一下技術交流分享群:“708 701 457”免費獲取
同時我經過多年的收藏目前也算收集到了一套完整的學習資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、Jvm效能調優、Spring,MyBatis,Nginx原始碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高階進階乾貨,希望對想成為架構師的朋友有一定的參考和幫助

