文章
SpringBoot的DispatcherServlet在哪里配置的
在传统的 Spring MVC 应用中,DispatcherServlet 通常需要显式地在 web.xml 文件中进行配置。然而,Spring Boot 的设计理念是“约定优于配置”,因此它极大地简化了 DispatcherServlet 的配置。
目录
在传统的 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 的配置主要由以下类完成:
DispatcherServletAutoConfiguration:- 这是 Spring Boot 提供的核心自动配置类之一。它负责在你的 Spring 应用程序上下文中自动注册一个
DispatcherServletBean。 - 默认情况下,这个
DispatcherServlet会被映射到根路径/。这意味着所有未被其他 Servlet 或 Filter 拦截的请求都会交由DispatcherServlet处理。 - 它还会设置一些默认的配置,例如默认的
HandlerMapping、HandlerAdapter、ViewResolver等组件。
- 这是 Spring Boot 提供的核心自动配置类之一。它负责在你的 Spring 应用程序上下文中自动注册一个
ServletWebServerFactoryAutoConfiguration:- 这个自动配置类负责配置嵌入式 Web 服务器(如 Tomcat、Jetty 或 Undertow)。它会创建一个 Web 服务器实例,并负责将
DispatcherServlet注册到这个服务器中。
- 这个自动配置类负责配置嵌入式 Web 服务器(如 Tomcat、Jetty 或 Undertow)。它会创建一个 Web 服务器实例,并负责将
为什么你通常看不到 DispatcherServlet 的配置?#
- 约定优于配置:Spring Boot 认为
DispatcherServlet是大多数 Web 应用程序的标配,因此它替你完成了这项工作,让你无需关注底层细节。 - 减少样板代码:省去了手动编写
web.xml或 Java 配置类来注册 Servlet 的繁琐步骤。 - 内嵌服务器集成:由于 Spring Boot 默认使用内嵌的 Web 服务器,它能够更无缝地将
DispatcherServlet集成到服务器启动流程中。
如果需要自定义 DispatcherServlet 的行为怎么办?#
尽管 Spring Boot 提供了默认的自动配置,但它也提供了灵活的方式让你自定义 DispatcherServlet 的行为,而无需完全禁用自动配置:
- 修改应用程序属性 (
application.properties或application.yml):- 你可以通过在配置文件中设置属性来修改
DispatcherServlet的一些行为,例如: Properties# 修改 DispatcherServlet 的路径映射<br>spring.mvc.servlet.path=/api/* - 值得注意的是,Spring Boot 2.0 以后,
spring.mvc.servlet.path已经不推荐直接修改/路径,因为它可能导致一些其他功能失效。如果你需要修改应用上下文路径,应该使用server.servlet.context-path。
- 你可以通过在配置文件中设置属性来修改
- 实现
WebAppConfigurer接口 (不推荐用于 DispatcherServlet 路径):- 对于更细粒度的 Spring MVC 配置(如拦截器、视图解析器等),你可以实现
WebMvcConfigurer接口并重写其方法。但对于DispatcherServlet本身的路径映射,这不是推荐的方式。
- 对于更细粒度的 Spring MVC 配置(如拦截器、视图解析器等),你可以实现
- 注册
ServletRegistrationBean或DispatcherServletBean (不推荐用于默认DispatcherServlet):- 如果你需要注册额外的
DispatcherServlet实例,或者你需要对默认的DispatcherServlet进行非常底层的、非标准化的定制,你可以通过在 Spring 配置类中声明ServletRegistrationBean或DispatcherServlet的 Bean 来实现。 - 但请注意:如果你注册了一个名为
dispatcherServlet的DispatcherServletBean,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 应用的开发和部署。