Spring原理之web.xml載入過程

2023-07-05 12:01:28

 

web.xml是部署描述檔案,它不是Spring所特有的,而是在Servlet規範中定義的,是web應用的組態檔。web.xml主要是用來設定歡迎頁、servlet、filter、listener等以及客製化servlet、JSP、Context初始化引數。
 
啟動一個WEB專案時,容器(包括JBoss、Tomcat等)首先會讀取專案web.xml組態檔裡的設定,當這一步驟沒有出錯並且完成之後,專案才能正常地被啟動起來。
 
Spring容器技術通過web.xml與web容器耦合。讀取Web.xml就可以獲取Spring容器的初始化資訊。
 
載入流程
 
context-param -> listener -> filter  -> servlet

  •  讀取<context-param>和<listener>
  • 建立全域性共用的ServletContext【ServletContext是容器的宿主環境】
  • 將<context-param>設定轉化為鍵值對,存入ServletContext
<!--context-param用來指定applicationContext.xml路徑
    ApplicationContext為spring容器的上下文,通過上下文操作容器中bean.
-->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
context-param設定
  • 建立<listener></listener>中的類範例
<listener>
  <listener-class>
    org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>
listener設定
  • 讀取<filter></filter>,根據指定的類路徑來範例化過濾器
<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>
    org.springframework.web.filter.CharacterEncodingFilter
  </filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <servlet-name>springmvc</servlet-name>
</filter-mapping>
filter設定
  • 如果系統中有<servlet></servlet>,則Servlet是在第一次發起請求的時候被範例化的,而且一般不會被容器銷燬,它可以服務於多個使用者的請求【使用<load-on-startup>1</load-on-startup>可以控制servlet在容器載入時就被範例化】
<!--  DispatcherServlet預設使用WebApplicationContext作為上下文,
      Spring組態檔預設為「/WEB-INF/[servlet名字]-servlet.xml」
      也可以通過init-param來指定 Spring組態檔路徑
-->
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
  <!--<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-name>/WEB-INF/springmvc-servlet.xml</param-name>
  </init-param>-->
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
servlet設定

 

總結:ServletContext是WebApplicationContext的底層支撐,所有的外界設定資訊讀到ServletContext中,然後再通過ContextLoaderListener觸發Spring根上下文的初始化

 

載入細節