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
重点关注下 DispatcherServletAutoConfiguration
和 WebMvcAutoConfiguration
这两个自动配置:
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);
}
分类:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具