知識庫 / Spring RSS 訂閱

Spring Initializer vs. web.xml

Spring
HongKong
4
02:47 PM · Dec 06 ,2025

1. 概述

本文檔將介紹最近版本的 Spring Framework 中可用的 DispatcherServlet 的三種不同的配置方法。

  1. 首先,我們將使用 XML 配置和 web.xml 文件
  2. 然後,我們將從 web.xml 文件中遷移 Servlet 聲明到 Java 配置,但將保留其他配置在 XML
  3. 最後,在重構的第三步,我們將擁有 100% 基於 Java 配置的項目

2. DispatcherServlet

Spring MVC 的核心概念之一是 DispatcherServlet。Spring 官方文檔將其定義為:

一個用於 HTTP 請求處理器的中心調度器,例如用於 Web UI 控制器或基於 HTTP 的遠程服務導出器。它負責將 Web 請求分發到已註冊的處理程序,並提供便捷的映射和異常處理功能。

基本上,DispatcherServlet 是每個 Spring MVC 應用程序的入口點。它的作用是攔截 HTTP 請求並將其分發到能夠處理該請求的正確組件。

3. 使用 web.xml 進行配置

如果處理遺留的 Spring 項目,很常見地會發現 XML 配置。在 Spring 3.1 之前,配置 DispatcherServlet 的唯一方式就是通過 WEB-INF/web.xml 文件。在這種情況下,需要進行兩個步驟。

讓我們來看一個示例配置 – 第一步是 Servlet 聲明:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

使用此 XML 塊,我們聲明瞭一個 servlet,它:

  1. 名為“dispatcher
  2. 是一個 org.springframework.web.servlet.DispatcherServlet 的實例
  3. 將被初始化為具有名為 contextConfigLocation 的參數,該參數包含配置 XML 的路徑

load-on-startup 是一個整數值,它指定多個 servlet 的加載順序。因此,如果您需要聲明多個 servlet,則可以定義它們初始化順序。用較小整數標記的 servlet 在用較大整數標記的 servlet 之前加載。

現在我們的 servlet 已配置完畢。下一步是聲明一個 servlet-mapping

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

通過servlet映射,我們將其限制為名稱,並將其與一個URL模式關聯起來,該模式指定由它處理的HTTP請求。

4. 混合配置

隨着 Servlet API 3.0 的採用,web.xml 文件已成為可選的,並且現在我們可以使用 Java 來配置 DispatcherServlet

我們可以註冊一個實現 WebApplicationInitializer 接口的 Servlet。 這相當於上述的 XML 配置。

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext context = new XmlWebApplicationContext();
        context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));

        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

在本示例中,我們正在:

  1. 實現 WebApplicationInitializer 接口
  2. 覆蓋 onStartup 方法,創建一個新的 XmlWebApplicationContext,該上下文配置與 servlet 中傳遞的文件相同(如 XML 示例所示)
  3. 然後,我們創建了一個 DispatcherServlet 的實例,該實例與我們剛剛實例化的新上下文關聯
  4. 最後,我們使用 URL 模式註冊 servlet

因此,我們使用 Java 聲明 servlet 並將其綁定到 URL 模式,但我們將配置保存在一個單獨的 XML 文件中:dispatcher-config.xml

5. 100% Java 配置

採用這種方法,我們的servlet將在Java中聲明,但仍然需要一個XML文件來配置它。通過使用WebApplicationInitializer,您可以實現100%的Java配置。

讓我們看看如何重構之前的示例。

首先,我們需要創建servlet的應用上下文。

這次,我們將使用基於註解的上下文,以便我們可以使用Java和註解來進行配置,並消除對像dispatcher-config.xml這樣的XML文件的需求。

AnnotationConfigWebApplicationContext context
  = new AnnotationConfigWebApplicationContext();

這種類型的上下文可以配置為註冊一個配置類:

context.register(AppConfig.class);

或者設置一個完整的包,該包將被掃描以查找配置類:

context.setConfigLocation("com.example.app.config");

現在我們的應用程序上下文已創建,我們可以為 ServletContext 添加一個監聽器,以加載上下文:

container.addListener(new ContextLoaderListener(context));

下一步是創建和註冊我們的dispatcher servlet:

ServletRegistration.Dynamic dispatcher = container
  .addServlet("dispatcher", new DispatcherServlet(context));

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");

現在我們的 WebApplicationInitializer 應該如下所示:

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context
          = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.example.app.config");

        container.addListener(new ContextLoaderListener(context));

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));
        
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

Java 和註解配置提供了許多優勢。通常它會導致更短、更簡潔的配置,並且註解為聲明提供了更多的上下文,因為它們與配置的代碼位於同一位置。

但是,這並不總是首選或甚至可能的方式。例如,一些開發者可能更喜歡將他們的代碼和配置分開,或者您可能需要與第三方代碼一起工作,而無法對其進行修改。

6. 結論

在本文中,我們介紹了在 Spring 3.2+ 中配置 DispatcherServlet 的各種方法。您應該根據自己的偏好選擇最適合的方法。 Spring 將適應您選擇的任何方案。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.