返回文章列表

文章

SpringBoot的DispatcherServlet在哪里配置的

在传统的 Spring MVC 应用中,DispatcherServlet 通常需要显式地在 web.xml 文件中进行配置。然而,Spring Boot 的设计理念是“约定优于配置”,因此它极大地简化了 DispatcherServlet 的配置。

目录
  1. Spring Boot 自动配置 DispatcherServlet 的方式
  2. 为什么你通常看不到 DispatcherServlet 的配置?
  3. 如果需要自定义 DispatcherServlet 的行为怎么办?
  4. 总结

在传统的 Spring MVC 应用中,DispatcherServlet 通常需要显式地在 web.xml 文件中进行配置。然而,Spring Boot 的设计理念是“约定优于配置”,因此它极大地简化了 DispatcherServlet 的配置。 在 Spring Boot 中,DispatcherServlet 的配置通常是自动完成的,你不需要手动去配置它。这是通过 Spring Boot 的自动配置(Auto-configuration)机制实现的。

Spring Boot 自动配置 DispatcherServlet 的方式#

当你在 Spring Boot 项目中引入 spring-boot-starter-web 依赖时,Spring Boot 会自动检测到这是一个 Web 应用程序,并会触发相关的自动配置类。其中,DispatcherServlet 的配置主要由以下类完成:

  1. DispatcherServletAutoConfiguration:
    • 这是 Spring Boot 提供的核心自动配置类之一。它负责在你的 Spring 应用程序上下文中自动注册一个 DispatcherServlet Bean。
    • 默认情况下,这个 DispatcherServlet 会被映射到根路径 /。这意味着所有未被其他 Servlet 或 Filter 拦截的请求都会交由 DispatcherServlet 处理。
    • 它还会设置一些默认的配置,例如默认的 HandlerMappingHandlerAdapterViewResolver 等组件。
  2. ServletWebServerFactoryAutoConfiguration:
    • 这个自动配置类负责配置嵌入式 Web 服务器(如 Tomcat、Jetty 或 Undertow)。它会创建一个 Web 服务器实例,并负责将 DispatcherServlet 注册到这个服务器中。

为什么你通常看不到 DispatcherServlet 的配置?#

  1. 约定优于配置:Spring Boot 认为 DispatcherServlet 是大多数 Web 应用程序的标配,因此它替你完成了这项工作,让你无需关注底层细节。
  2. 减少样板代码:省去了手动编写 web.xml 或 Java 配置类来注册 Servlet 的繁琐步骤。
  3. 内嵌服务器集成:由于 Spring Boot 默认使用内嵌的 Web 服务器,它能够更无缝地将 DispatcherServlet 集成到服务器启动流程中。

如果需要自定义 DispatcherServlet 的行为怎么办?#

尽管 Spring Boot 提供了默认的自动配置,但它也提供了灵活的方式让你自定义 DispatcherServlet 的行为,而无需完全禁用自动配置:

  1. 修改应用程序属性 (application.propertiesapplication.yml):
    • 你可以通过在配置文件中设置属性来修改 DispatcherServlet 的一些行为,例如: Properties # 修改 DispatcherServlet 的路径映射<br>spring.mvc.servlet.path=/api/*
    • 值得注意的是,Spring Boot 2.0 以后,spring.mvc.servlet.path 已经不推荐直接修改 / 路径,因为它可能导致一些其他功能失效。如果你需要修改应用上下文路径,应该使用 server.servlet.context-path
  2. 实现 WebAppConfigurer 接口 (不推荐用于 DispatcherServlet 路径):
    • 对于更细粒度的 Spring MVC 配置(如拦截器、视图解析器等),你可以实现 WebMvcConfigurer 接口并重写其方法。但对于 DispatcherServlet 本身的路径映射,这不是推荐的方式。
  3. 注册 ServletRegistrationBeanDispatcherServlet Bean (不推荐用于默认 DispatcherServlet):
    • 如果你需要注册额外DispatcherServlet 实例,或者你需要对默认的 DispatcherServlet 进行非常底层的、非标准化的定制,你可以通过在 Spring 配置类中声明 ServletRegistrationBeanDispatcherServlet 的 Bean 来实现。
    • 但请注意:如果你注册了一个名为 dispatcherServletDispatcherServlet Bean,Spring Boot 的自动配置会退让,不再自动配置它。这通常只在你确实需要完全控制 DispatcherServlet 实例时才使用。 Java

@Configuration public class MyWebConfig {

// 不推荐在大多数情况下覆盖默认的 DispatcherServlet,
// 除非你有非常特殊的、需要完全控制的场景。
// 如果你希望修改默认 DispatcherServlet 的行为,通常通过属性或 WebMvcConfigurer。
@Bean
public DispatcherServlet dispatcherServlet() {
    return new DispatcherServlet();
}

@Bean
public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration(
        DispatcherServlet dispatcherServlet) {
    ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(dispatcherServlet, "/app/*");
    registration.setName("customDispatcherServlet"); // 设置一个不同的名称
    registration.setLoadOnStartup(1);
    return registration;
}

} ```

总结#

在 Spring Boot 中,你通常不需要担心 DispatcherServlet 的配置,因为它由 spring-boot-starter-web 依赖以及相关的自动配置类(尤其是 DispatcherServletAutoConfiguration)在应用程序启动时自动完成。这种自动化极大地简化了 Spring Boot Web 应用的开发和部署。