配置DispatcherServlet類時load-on-startup標籤作用源碼分析

我們在使用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>  的核心,對各種資源進行初始化。

 

 

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