在Spring MVC中,首先進行的是IoC容器的初始化,包括Root和DispatchServlet對應的content。在IoC容器準備好以後,就開始進行MVC的初始化,包括關於HandleMapping、ViewResolver等的初始化。
在Spring MVC中,MVC的初始化在DispatchServlet的initStrategies方法中進行的。
MVC框架需要的主要功能是根據http請求的信息選擇合適的controller,調用controller後,根據返回的結果選擇合適視圖進行渲染。所以在這裏主要關注一下這兩個方法:initHandlerMappings和initViewResolvers。initHandlerMappings方法初始化了尋找controller的規則,initViewResolvers初始化視圖解析的方法。
那麼首先來看一下initHandlerMappings。在spring mvc中,關於尋找controller的規則是用HandleMapping表示的,首先看一下HandleMapping接口類圖:
在HandlerMapping接口中,定義了getHandler方法,根據http請求,取得對應的處理對象。這個處理請求的對象用HandlerExecutionChain類表示,在這個類中,包含兩個主要屬性,一個是真正處理請求的handler,另外一個是Interceptor的集合。
介紹完HandlerMapping接口後,就來看一下Spring MVC中是如何初始化HandlerMapping信息的:
在上述方法中,做的主要工作是是從容器中獲取所有HandlerMapping類型的bean,然後將這些bean按照一定的規則進行排序(order接口),最後爲handlerMap賦值,這樣關於HandlerMapping的信息就全紀錄在handlerMap中了。當有http請求時,會遍歷handlerMap集合,選擇合適的HandlerMapping實現,調用getHandler方法取得HandlerExecutionChain對象,然後執行真正的業務處理。
在調用完controller後,Spring MVC會進行根據執行結果進行視圖解析,這個任務是由ViewResolver進行的,關於ViewResolver的工作原理,見這篇文章:http://blog.csdn.net/prince2270/archive/2010/09/17/5891085.aspx。
那下面就來看一下Spring MVC是如何初始化ViewResolver信息的:
與HandlerMapping信息的初始化方法類似,取得IoC容器中所有的ViewResolver類型的bean,將其放入到viewResolvers中,並按照一定的規則進行排序。
經過MVC的初始化,所有的信息已經準備就緒,時刻準備着處理http請求了。