SpringMVC啟動過程詳解(Ali),springmvcali

來源:互聯網
上載者:User

SpringMVC啟動過程詳解(Ali),springmvcali

  通過對SpringMVC啟動過程的深入研究,期望掌握Java Web容器啟動過程;掌握SpringMVC啟動過程;瞭解SpringMVC的設定檔如何配置,為什麼要這樣配置;掌握SpringMVC是如何工作的;掌握Spring源碼的設計和增強閱讀源碼的技巧。

目錄

1.Web容器初始化過程

2.SpringMVC中web.xml配置

3.認識ServletContextListener

4.認識ContextLoaderListener

5.DispatcherServlet初始化(HttpServletBean • FrameworkServlet • DispatcherServlet)

6.ContextLoaderListener與DispatcherServlet關係

7.DispatcherServlet的設計

8.DispatcherServlet工作原理

 

一、Web容器初始化過程

展示了web容器初始化的過程,其官方文檔給出了這樣的描述:

  When a web application is deployed into a container, the following steps must be performed, in this order, before the web application begins processing client requests.

二、SpringMVC中web.xml的配置

是截取的web.xml中的配置,在<listener>標籤中定義了spring容器載入器;在<servlet>標籤中定義了spring前端控制器。

是源碼中介面ServletContextListener的定義,可以看到在其注釋中指明:servlet和Filter初始化前和銷毀後,都會給實現了servletContextListener介面的監聽器發出相應的通知。

上面是類ContextLoadListener的定義,它實現了上面的servletContextListener。這裡用到了代理模式,簡單的代理了ContextLoader類。ContextLoadListener類用來建立Spring application context,並且將application context註冊到servletContext裡面去。

結合上面的WEB容器啟動的過程,以及介面ServletContextListener和類ContextLoadListener。我們知道:

  在 Servlet API中有一個ServletContextListener介面,它能夠監聽ServletContext對象的生命週期,實際上就是監聽Web應用的生命週期。當Servlet容器啟動或終止Web應用時,會觸發ServletContextEvent事件,該事件由ServletContextListener來處理。在ServletContextListener介面中定義了處理ServletContextEvent 事件的兩個方法contextInitialized()和contextDestroyed()。

  ContextLoaderListener監聽器的作用就是啟動Web容器時,自動裝配ApplicationContext的配置資訊。因為它實現了ServletContextListener這個介面,在web.xml配置了這個監聽器,啟動容器時,就會預設執行它實現的方法。由於在ContextLoaderListener中關聯了ContextLoader這個類,所以整個載入配置過程由ContextLoader來完成。

上面是initWebApplicationContext的過程,方法名稱即是其含義。方法中首先建立了WebApplicationContext,配置並且重新整理執行個體化整個SpringApplicationContext中的Bean。因此,如果我們的Bean配置出錯的話,在容器啟動的時候,會拋異常出來的。

  綜上,ContextLoaderListener類起著至關重要的作用。它讀取web.xml中配置的context-param中的設定檔,提前在web容器初始化前準備業務對應的Application context;將建立好的Application context放置於ServletContext中,為springMVC部分的初始化做好準備。

三、DispatchServlet初始化

  在SpringMVC架構中,DispatchServlet負責請求分發,起到控制器的作用。下面詳細來解釋說明:

DispatchServlet名如其義,它的本質上是一個Servlet。從上面圖可以看到,下層的子類不斷的對HttpServlet父類進行方法擴充。

是抽象類別HttpServletBean的實現,我們知道HttpServlet有兩大核心方法:init()和service()方法。HttpServletBean重寫了init()方法,在這部分,我們可以看到其實現思路:公用的部分統一來實現,變化的部分統一來抽象,交給其子類來實現,故用了abstract class來修飾類名。此外,HttpServletBean提供了一個HttpServlet的抽象實現,使的Servlet不再關心init-param部分的賦值,讓servlet更關注於自身Bean初始化的實現。

是FrameworkServlet的官方定義, 它提供了整合web javabean和spring application context的整合方案。那麼它是如何?的呢?在源碼中我們可以看到通過執行initWebApplicationContext()方法和initFrameworkServlet()方法實現。

DispatchServlet是HTTP請求的中央調度處理器,它將web請求轉寄給controller層處理,它提供了敏捷的映射和異常處理機制。DispatchServlet轉寄請求的核心代碼在doService()方法中實現,詳細代碼參照圖上。

是DispatchServlet類和ContextLoaderListener類的關係圖。首先,用ContextLoaderListener初始化上下文,接著使用DispatchServlet來初始化WebMVC的上下文。

是DispatchServlet的工作流程圖,作為HTTP請求的中央控制器,它在SpringMVC中起著分發請求的作用。下面總結了DispatchServlet設計的一些特點總結。

四、請求流程

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.