spring 啟動過程
對於一個web應用,其部署在web容器中,web容器提供其一個全域性的上下文環境,這個上下文就是ServletContext,web容器會讀取配置在web.xml中的監聽器,從而啟動spring容器。
web容器的初始化過程為:
1、 web.xml在<context-param></context-param>標籤中宣告應用範圍內的初始化引數
2 、啟動一個WEB專案的時候,容器(如:Tomcat)會去讀它的配置檔案web.xml.讀兩個節點: <listener>和<context-param>
3、 緊接著,容器建立一個ServletContext(上下文)。在該應用內全域性共享。
4、 容器將<context-param>轉化為鍵值對,並交給ServletContext.
5、 容器建立<listener>中的類例項,即建立監聽.該監聽器必須實現自ServletContextListener介面
6、 在監聽中會有contextInitialized(ServletContextEvent event)初始化方法
在這個方法中獲得
ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的鍵");
這個方法中會完成spring容器的建立,初始化,以及beans的建立。預設listener為ContextLoaderListener
initWebApplicationContext()主要做三件事
1.建立WebApplicationContext,通過createWebApplicationContext()方法
2.載入spring配置檔案,並建立beans。通過configureAndRefreshWebApplicationContext()方法
3.將spring容器context掛載到ServletContext 這個web容器上下文中。通過servletContext.setAttribute()方法。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--web專案中上下文初始化引數, name value的形式 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!--ContextLoaderListener,會通過它的監聽啟動spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--DispatherServlet,前端MVC核心,分發器,SpringMVC的核心-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
spring配置時:<context:exclude-filter>的使用原因,為什麼在applicationContext.xml中排除controller,而在spring-mvc.xml中incloud這個controller?
web容器初始化webApplicationContext時作為公共的上下文環境,只需要將service、dao等的配置資訊在這裡載入,而servlet自己的上下文環境資訊不需要載入。故,在applicationContext.xml中將@Controller註釋的元件排除在外,而在dispatcherServlet載入的配置檔案中將@Controller註釋的元件載入進來,方便dispatcherServlet進行控制和查詢。故,配置如下:
applicationContext.mxl中:
<context:component-scan base-package="com.linkage.edumanage">
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" />
</context:component-scan>
spring-mvc.xml中:
<context:component-scan base-package="com.brolanda.cloud" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation" />
</context:component-scan>