1. 程式人生 > >Spring Web 啟動流程

Spring Web 啟動流程

1.spring在web容器(tomcat)中的啟動過程

a) ServletContext: tomcat啟動會建立一個ServletContext,作為全域性上下文以及spring容器的宿主環境。當執行Servlet的init()方法時,會觸發ServletContextListener的 public void contextInitialized(ServletContextEvent sce);方法

b)WebApplicationContext: 在web.xml(上圖)中我們配置了ContextLoaderListener,該listener實現了ServletContextListener的contextInitialized方法用來監聽Servlet初始化事件。

下圖中紅框部門的註釋解釋了該方法的作用。即初始化根上下文(即IOC容器),也就是WebApplicationContext。該類是一個介面類,其預設實現為XmlWebApplicationContext。

在initWebApplicationContext這個方法中進行了建立根上下文,並將該上下文以key-value的方式儲存到ServletContext中

以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE為key,this.context則為value。this.context就是剛才建立的根上下文。後面就可以通過這個ServletContext通過這個key獲取該上下文了。而在web.xml中還有一對重要的標籤

<context-param>該標籤內的<param-name>的值是固定的原因在這張圖上。該常量的值就是contextConfigLocation。通過該方法去尋找定義spring的xml檔案。來初始化IOC容器的相關資訊。

c) DispatcherServlet的上下文: 在WebApplicationContext初始化完後。開始初始化web.xml中的servlet。這個servlet可以有多個。預設我們都使用DispatcherServlet。<servlet>標籤中可以有<init-param>標籤用來配置一些DispatcherServlet的初始化引數。

該servlet初始化流程是有tomcat的Servlet的init()方法觸發。DispatcherServleet-繼承->FrameworkServlet-繼承->HttpServletBean-繼承-GenericServlet- 實現 ->Servlet。這樣的一條關係鏈。其核心方法在FrameworkServlet中的initServletBean()中

中的initWebApplicationContext()方法中。

initWebApplicationContext()方法中的第一個紅色框內就是去獲取之前存在Servlet中的WebApplicationContext。通過上面說的WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE作為key

取到之後,設定為當前DispatcherServlet的父上下文。並且也把該上下文存在ServletContext中。方法如下

a). 通過以上的流程,可以做到各個上下文之間既可以擁有自己獨立的Bean,也可以訪問各個Servlet相同的Bean

b). 通過init方法建立的dispatcherServlet上下文可以訪問通過ServletContextListener中建立的WebApplicationContext上下文中的bean,反之則不行。因為WebApplicationContext是dispatcherServlet上下文的父容器。

3. api文件