SpringBoot 启动时 springMVC 的自动配置

在 Spring Boot 中,MVC 相关的组件配置主要发生在应用启动时会加载所有能自动配置的类,这些类放在一个文件中

  • springboot2.x 版本: META-INF/spring.factories
  • Springboot3.x 版本:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.imports

所有的自动配置类

并不是所有的都会配置,会有一些条件注解筛选

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

重点关注下 DispatcherServletAutoConfigurationWebMvcAutoConfiguration 这两个自动配置:

  • DispatcherServletAutoConfiguration 主要负责 DispatcherServlet 的配置与初始化,它是 Web 应用的核心,负责将 HTTP 请求转发给相应的控制器
  • WebMvcAutoConfiguration 主要负责 Web MVC 的其他配置,包括视图解析、消息转换器、请求处理器等

DispatcherServletAutoConfiguration 自动配置类

这里配置了 dispatcherServlet 组件 ,什么时候初始化 springboot 不同大版本表现不一致,SpringBoot 2.x 会及时初始化,SpringBoot 3.x 会延迟初始化(接收到第一个请求才开始初始化)

具体怎么初始化就和 Spring MVC 一致了,看这里

// 创建 dispatcherservlet
@Bean(name = {"dispatcherServlet"})
public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {
    DispatcherServlet dispatcherServlet = new DispatcherServlet();
    dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());
    dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());
    this.configureThrowExceptionIfNoHandlerFound(webMvcProperties, dispatcherServlet);
    dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());
    dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());
    return dispatcherServlet;
}

// dispatcherservlet 注册到 Servlet 容器(Tomcat、jetty 等,不写 XML 了可能不记得还要注册到 Tomcat 了~)
@Bean(name = {"dispatcherServletRegistration"})
@ConditionalOnBean(value = {DispatcherServlet.class},name = {"dispatcherServlet"})
public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet, WebMvcProperties webMvcProperties, ObjectProvider<MultipartConfigElement> multipartConfig) {
  	// 默认接管的地址是 '/' 表示所有请求都经过 dispatcherservlet
    DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet, webMvcProperties.getServlet().getPath());
    registration.setName("dispatcherServlet");
    registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());
    Objects.requireNonNull(registration);
    multipartConfig.ifAvailable(registration::setMultipartConfig);
    return registration;
}

WebMvcAutoConfiguration 自动配置类

DispatcherServletAutoConfiguration 侧重于 DispatcherServlet 本身,WebMvcAutoConfiguration 提供了 Spring MVC 的更高层次的配置,涵盖了视图解析、消息转换等多个方面

@Bean
@ConditionalOnMissingBean
public InternalResourceViewResolver defaultViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix(this.mvcProperties.getView().getPrefix());
        resolver.setSuffix(this.mvcProperties.getView().getSuffix());
        return resolver;
}
        
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
        return (WelcomePageHandlerMapping)this.createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageHandlerMapping::new);
}

@Bean
public WelcomePageNotAcceptableHandlerMapping welcomePageNotAcceptableHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
        return (WelcomePageNotAcceptableHandlerMapping)this.createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageNotAcceptableHandlerMapping::new);
}
posted @   CyrusHuang  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示