spring mvc中load-on-startup標籤的作用是完成servlet加載,下面分析一下加載的執行過程:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>mvc</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
按住Ctrl點擊DispatcherServlet類中,但是在該類中並不能找到servlet啓動的init方法:
於是再Ctrl點擊進入DispatcherServlet的父類FrameworkServlet中,但是在該類中依然不能找到init方法:
於是再繼續Ctrl點擊進入FrameworkServlet的父類HTTPServletBean中,init方法便是啓動過程中第一個執行的方法:
其中,第171行調用的initServletBean方法,Ctrl點擊進入發現該方法體中沒有內容,原因:
HTTPServletBean中init方法被DispatcherServlet繼承後並調用,所以DispatcherServlet調用init方法執行到initServletBean方法後,首先調用從父類FrameworkServlet繼承的initServletBean方法,而上面的方法是在HTTPServletBean類中, 下面的initServletBean方法是FrameworkServlet類中的,也是init方法中所調用的;
上面方法中,第494行調用FrameworkServlet類中initWebApplicationContext方法:
上面第560行,調用的onRefresh方法在FrameworkServlet中又是方法體內無內容的方法;
於是再尋找其子類DispatcherServlet中onRefresh方法,onRefresh方法再調用initStrategies方法,即完成servlet加載