配置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>  的核心,对各种资源进行初始化。

 

 

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