我们在使用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> 的核心,对各种资源进行初始化。