1. 程式人生 > >spring 啟動過程

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>