DispatcherServlet 加載過程與請求過程

1、DispatcherServlet加載過程

1.contextLoaderListener監聽器初始化完畢後,開始初始化web.xml中的Servlet,DispatcherServlet實際也是一種Servlet,作爲一個前端控制器用於轉發、匹配、處理servlet請求。

2.DispatcherServlet上下文初始化的時候回建立自己的IOC上下文,利用WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE先從ServletContext中獲取根上下文(WebApplicationContext)作爲自己上下文parent的上下文。

3.有了這個parent上下文之後,初始化自己持有的上下文。initStrategies(ApplicationContext)。

3.1 initMultipartResolver(context); // 初始化該類使用的多部件解析器。

3.2 initLocaleResolver(context); // 初始化該類使用的LocaleResolver。

3.3 initThemeResolver(context); // 初始化該類使用的ThemeResolver。

3.4 initHandlerMappings(context); // 初始化該類使用的HandlerMappings。

3.5 initHandlerAdapters(context); // 初始化該類使用的handleradapter。

3.6 initHandlerExceptionResolvers(context); // 初始化該類使用的HandlerExceptionResolver。

3.7 initRequestToViewNameTranslator(context); // 初始化此servlet實例使用的RequestToViewNameTranslator。

3.8 initViewResolvers(context); // 初始化該類使用的視圖解析器。

3.9 initFlashMapManager(context); // 初始化這個servlet實例使用的{FlashMapManager}。

4.初始化完成後,spring以與servlet名字相關的屬性作爲key,將其存入ServletContext中,以便後續使用。這樣每個servlet持有自己的上下文,即擁有自己獨立的bean空間,同時各個servlet共享相同的bean,即根上下文定義的bean。

2、DispatcherServlet基礎關係

HttpServletBean繼承HttpServlet:Web容器啓動時將調用它的init方法,該初始化方法主要作用將Servlet初始化參數(init-param)設置到改組件上(contextAttribute,contextClass,namespace,contextConfigLocation),通過BeanWrapper簡化設置過程,方便後續使用;提供給自類初始化擴展點,initServletBean(),該方法由FrameworkServlet覆蓋

FrameworkServlet繼承HttpServletBean:初始化web上下文;提供給子類初始化擴展點

DispatcherServlet繼承FrameworkServlet:實現onRefresh()方法提供的一些前端控制器先關配置;初始化Spring Web MVC使用的Web上下文,並且可能指定父容器;初始化DispatcherServlet使用的策略,如HandlerMapping,HandlerAdapter等

3、DispatcherServlet請求過程

1. 首先用戶發送請求 ——> DispatcherServlet,前端控制器收到請求後自己不進行處理,而是委託給其他的解析器進行處理,作爲統一訪問點,進行全局的控制流程

2. DispatcherServlet ——> HandlerMapping,HandlerMapping會將請求映射爲HanderExcutionChain 對象(一個Handler處理器(頁面控制器)對象,多個HandlerInterceptor攔截器),通過這種策略模式,很容易添加新的映射策略

3. DispatcherServlet ——> HandlerAdapter,HandlerAdapter將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器

4. HandlerAdapter ——> 處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器功能處理方法,完成功能處理,返回一個ModelAndView對象(模型數據,邏輯視圖名)

5. ModelAndView的邏輯視圖名 ——> ViewResolver,ViewResolver將邏輯視圖名解析爲具體的View,通過這種策略模式,很容易轉換爲其他視圖技術

6. View ——> 渲染,View 會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,因此很容易支持其他視圖技術

7. 返回控制權給DispatcherServlet,有DispatcherServlet返回相應給用戶,到此一個流程結束。

4、DispatcherServlet啓動UML圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章