本文基於 Spring 源碼視角,系統梳理 Spring MVC 容器啟動全鏈路:Web 容器初始化 → ContextLoaderListener 創建根上下文 → DispatcherServlet 初始化 Web 上下文 → 請求分發處理流程。掌握核心類繼承體系、關鍵模板方法、上下文層級關係,為源碼閱讀與疑難排查打基礎。
ServletContextListener 實現類contextInitialized(ServletContextEvent)Filter 並調用 init()Servlet (load-on-startup > 0) 並調用 init()<!-- 1. 根上下文加載器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<!-- 2. 前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
ServletContextListener,代理模式包裝 ContextLoadercontextInitialized() → ContextLoader.initWebApplicationContext()XmlWebApplicationContext (根上下文)contextConfigLocation 指定的 Bean 定義 (Service、DAO、DataSource、事務管理器等)ServletContext 屬性 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTEHttpServletBean (抽象)
↓ init() 解析 init-param → setBeanProperties()
FrameworkServlet (抽象)
↓ initWebApplicationContext() 創建/刷新 WebApplicationContext
↓ initFrameworkServlet() 留給子類擴展
DispatcherServlet (具體)
↓ onRefresh() 初始化九大組件 (HandlerMapping, HandlerAdapter, ViewResolver...)
| 類 | 方法 | 職責 |
|---|---|---|
| HttpServletBean | init() | 將 <init-param> 綁定到 Bean 屬性,模板方法模式 |
| FrameworkServlet | initWebApplicationContext() | 創建 WebApplicationContext,建立父子關係 (父=根上下文),調用 refresh() |
| FrameworkServlet | initFrameworkServlet() | 空實現,子類擴展點 |
| DispatcherServlet | onRefresh() | 初始化策略組件:initStrategies() |