springMVC請求調用過程
在傳統的MVC模式中,Tomcat通過讀取web.XML配置文件來獲取servlet和訪問路徑的映射關係,這樣在訪問tomcat就能將請求轉發給對應的servlet進行處理。
自定義的servlet是需要繼承HttpServlet這個類,眾所周知,一個servlet的生命周期是要經歷的init()、service()、destory()這幾個過程,最初通過繼承GenericServlet類重寫上面三個方法來實現自定義的servlet,之後通常是通過繼承HttpServlet這個類是實現doGet()和doPost()來實現自定義的servlet。其實HttpServlet也是繼承了GenericServlet重寫了生命周期方法將servletResquest和servletResponse強轉成HttpServletRequset和HttpServletResponse,然後使用模板方法的設計模式,判斷請求方式進行調用重寫的方法。
接下來轉回正題,查看SpringMVC的調用過程,在SpringMVC中只使用了DispatcherServlet來攔截了所有的請求,在上次將filter的調用過程中,最後執行的servlet就是dispatcherServlet,在創建ApplicationFilterChain的時候就將其給賦值進去了。
DispatcherServlet也是繼承了HttpServlet類,可以去debug查看DispatcherServlet和HttpServlet之間的繼承關係,在接下來的幾步父類和子類之間重寫方法的互相調用,重點是如何由通過映射調用到Servlet到通過路徑找到對應控制器的方法。主要的執行語句是:org/springframework/web/servlet/handler/AbstractHandlerMapping.class:225
可以看到根據request找到相對應控制器的方法的元數據資訊,即org.springframework.web.method.HandlerMethod
深入方法中可以看到org.springframework.web.servlet.handler.AbstractHandlerMethodMapping中存儲控制器中路徑和方法元數據的的數據結構
其實到這裡我們可以猜出是通過反射調用的方式來請求控制器方法的了,具體的調用語句是:
org/springframework/web/method/support/InvocableHandlerMethod.class:102
剩下的就是獲取HandleMethod中的Method和bean、request中的args,進行反射調用了。
在這其中的數據組裝就不涉及了。