首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 核心配置詳解:spring-servlet.xml 與 applicationContext.xml 的職責邊界與加載機制

     編輯:Java 綜合教學

為什麼要區分這兩個配置文件?

在 Spring MVC 專案中,applicationContext.xml(常命名為 root-context.xml)與 spring-servlet.xml(常命名為 servlet-context.xml)是兩個核心配置文件,它們分別對應 Spring 容器的兩個層級:根容器與Servlet 容器。混淆兩者會導致 Bean 重複創建、事務失效、依賴注入失敗等疑難雜癥。本文從文件位置、作用域、web.xml 加載配置三個維度徹底釐清兩者關係。

一、文件存放位置與命名慣例

雖然文件名可自定義,但遵循慣例有利於團隊協作:

  • applicationContext.xml (root-context.xml):放置於 WEB-INF/spring/ 或 WEB-INF/ 目錄下,屬於專案級全局配置。
  • spring-servlet.xml (servlet-context.xml):放置於 WEB-INF/spring/appServlet/ 或 WEB-INF/ 更深層目錄,屬於特定 DispatcherServlet 專用配置。

配置文件目錄結構示例

二、核心差異:作用域與 Bean 可見性

維度 applicationContext.xml (根容器) spring-servlet.xml (Servlet 容器)
容器層級 根應用上下文 DispatcherServlet 子上下文
作用範圍 全局(Service、DAO、DataSource、TransactionManager 等業務組件) Web 層(Controller、ViewResolver、HandlerMapping、Interceptor 等)
父子關係 父容器 子容器(可訪問父容器 Bean,父不可訪問子)
生命週期 隨 ServletContext 銷毀 隨 DispatcherServlet 銷毀
典型配置項 數據源、事務管理、MyBatis/SQLSessionFactory、Service Bean、AOP 切面 Controller 掃描、視圖解析器、靜態資源映射、攔截器、MultipartResolver

關鍵原則:業務邏輯組件(Service、DAO)放入根容器,確保單例、事務生效;Web 控制組件放入 Servlet 容器,避免多 Servlet 共享 Controller 導致狀態混亂。

三、web.xml 中的雙容器啟動配置

根容器由 ContextLoaderListener 啟動,Servlet 容器由 DispatcherServlet 初始化時自動加載:

<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee 
         https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <display-name>SpringMVC-Demo</display-name>

    <!-- 1. 根容器啟動監聽器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>

    <!-- 2. Spring MVC 前端控制器 -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

四、常見誤區與最佳實踐

  1. 錯誤:在 spring-servlet.xml 中掃描 @Service、@Repository 導致雙份 Bean,事務註解 @Transactional 失效。
    正確:根容器掃描 com.xxx.service、com.xxx.dao;Servlet 容器僅掃描 com.xxx.controller。
  2. 錯誤:DataSource、TransactionManager 配置在 Servlet 容器,導致非 Web 環境(如定時任務、測試)無法復用。
    正確:基礎設施 Bean 全部置於根容器。
  3. 進階:若有多個 DispatcherServlet(如 REST API + 後台管理),它們共享同一根容器,各自擁有獨立 Servlet 容器,實現業務邏輯復用與 Web 層隔離。

總結

applicationContext.xml 構建應用骨架(數據訪問、事務、業務邏輯),spring-servlet.xml 構建 Web 表現層(路由、視圖、參數綁定)。父子容器機制實現了「業務邏輯單例全局共享,Web 組件請求級隔離」的架構目標。配置時請嚴格遵循分層原則,避免跨層掃描與重複定義。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved