我們在使用ssm時在 web.xml 中有如下配置
<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:application.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
在 <servlet> 中有 <load-on-startup> 標籤,該標籤的作用是當 Tomcat 服務器發佈 Web 項目時創建 DispatcherServlet 對象並執行 init 方法,然而 DispatcherServlet 類中並沒有 init() 方法,而且 DispatcherServlet 的父類 FrameworkServlet 中也沒有 inti() 方法,我們再去找 FrameworkServlet 的父類 HttpServletBean。
最終我們在 HttpServletBean 中找到了 init() 方法
在 init() 方法中順序執行會達到 initServletBean 方法,然而我們發現在 HttpServletBean 中該方法是一個抽象類
回到 FrameworkServlet 類中,我們可以看到 initServletBean 方法在 FrameworkServlet 中得到實現
在 initServletBean 中順序推進,會執行 this.webApplicationContext = initWebApplicationContext(); 方法
在 initWebApplicationContext 方法中我們可以明確的看出,該方法在爲 wac (WebApplicationContext對象) 賦值,而 if 語句中的 refreshEventReceived 常量在上面定義爲 false, 所以 !refreshEventReceived 爲 true 執行語句
然而 FrameworkServlet 中的 onRefresh 方法爲一個抽象類
在他的子類 DispatcherServlet 中有 onRefresh 的實現方法
在 onRefresh 中進入 initStrategies 方法
initStrategies 初始化策略,該方法所調用的上述方法爲 <load-on-startup> 的核心,對各種資源進行初始化。