57、原生組件注入DispatcherServlet注入原理
#### 繼承關系
- `DispatcherServlet`繼承自`FrameworkServlet`,而`FrameworkServlet`繼承自`HttpServletBean`,最終`HttpServletBean`繼承自`HttpServlet`。
- `DispatcherServlet`實現了`ApplicationContextAware`接口。
#### 初始化過程
1. **`init()`方法(`HttpServletBean`)**
? ?- 在`Servlet`容器啟動時,`init()`方法被調用。
? ?- 該方法將`Servlet`配置參數注入到`DispatcherServlet`中。
? ?- 主要步驟:
? ? ?- 獲取`Servlet`配置參數,創建`PropertyValues`對象。
? ? ?- 將當前`Servlet`轉換為`BeanWrapper`,以便使用`Spring`的方式注入參數。
? ? ?- 調用子類的`initServletBean()`方法。
? ?
2. **`initServletBean()`方法(`FrameworkServlet`)**
? ?- 初始化`WebApplicationContext`,這是`Spring MVC`的核心容器。
? ?- 主要步驟:
? ? ?- 調用`initWebApplicationContext()`方法創建或獲取`WebApplicationContext`。
? ? ?- 發布上下文到`ServletContext`。
? ? ?- 調用`onRefresh()`方法,進行`DispatcherServlet`的個性化配置。
#### 關鍵方法分析
- **`initWebApplicationContext()`**
? - 創建或獲取`WebApplicationContext`實例。
? - 如果已存在`WebApplicationContext`,則進行配置和刷新。
? - 否則,創建新的`WebApplicationContext`,并將其與`ServletContext`關聯。
- **`onRefresh()`**
? - 在`WebApplicationContext`初始化完成后調用。
? - 調用`initStrategies()`方法,初始化`Spring MVC`的各個組件,如處理器映射、視圖解析器等。
#### 總結
`DispatcherServlet`的注入原理主要依賴于`Servlet`容器的生命周期和`Spring`的依賴注入機制。在初始化過程中,通過繼承關系調用關鍵方法,完成`WebApplicationContext`的創建和各個組件的初始化,最終實現`DispatcherServlet`的注入和配置。