Spring Boot Web开发之web相关配置——SpringMVC自动配置(一)
在Spring Boot自动配置实战中,可以看到使用@ReqeusMapping这类SpringMVC的注解,但是并没有对Spring MVC web.xml相关的配置,那么为什么能使用呢?可以确定Spring Boot 帮助开发者做了web.xml的配置工作并且对@Controller标记的包进行了扫描。可以看到依赖文件中自动配置了如下starter:
如果不使用Spring Boot,一个普通的web项目如何使用Spring MVC呢?在SpringMVC的web配置——JDK中SPI机制的应用中有详细阐述。
同时需要注意到的是:在Spring Boot项目中并没有xml相关配置文件的读取工作。这是为什么呢?这就与Servlet3.0规范有关了。通过web.xml配置可知其本身就是一个servlet的配置,应该符合servlet相关规范。那么Servlet3.0的规范提供了注解驱动功能,可以不再使用xml配置而是通过implements WebApplicationInitializer,直接使用servletContext.addServlet(name,this.servlet)类似即可。
SpringBoot就是运用Servlet3.0规范的同时通过servlet运行时插件动态地往web容器中添加一个DispatcherServlet对象,实现了自动装配Spring MVC了。根据之前Spring Boot starter实战相关的步骤经验逆推,验证Spring MVC自动配置的原理。
一、注册配置
可以在spring boot自动配置包下spring.factories找到如下内容:
二、自动配置DispacherServlet类
@ConditionalOnClass条件注入DispacherServlet Bean,可参考文章Spring Boot 热插拔技术应用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)
三、属性配置
从上图看,注解中没有关于属性配置的相关内容,那么这个自动配置都是默认固定的配置么?当然不是,看看这个类的类图:
这个类中有四个内部类,其中关注DispatcherServletRegistrationConfiguration 和DispatcherServletConfiguration两个类。
DispatcherServletRegistrationConfiguration类通过名字就可以猜测出功能是将servlet注册到容器中的注册类。Servlet实例要被注册到如tomcat这样的ServletContext里才能提供请求服务,所以这个类将生成一个Bean,负责通过servletContext.addServlet()方法将DispatcherServlet注册到ServletContext中。DispatcherServletConfiguration就是配置DispatcherServlet各参数。
这里分析DispatcherServletConfiguration配置类
@Conditional指明了一个前置条件判断,又DefaultDispatcherServletCondition实现。主要判断是否已经存在DispatcherServlet,如果没有才会除非解析。
@ConditionalOnClass指明当ServletRegistration这个类存在的时候才会触发生成的DispatcherServlet才能注册到ServletContext中。
@EnableConfigrationProperties将会从application.properties这样的配置文件中读取spring.mvc前缀的属性生成配置对象WebMvcProperties。
再看其内部代码:
这个就是典型的Java Bean方式注册Bean,生成了DispatcherServlet的Bean对象。但其可使用还需注册到ServletContext对象中。上面分析源码中DispatcherServletRegistrationConfiguration提供该功能,下面分析该功能:
具体看看DispatcherServletRegistrationBean的类图:
其实现了ServletContextInitializer,实现了Servlet的注册。具体注册流程可参考红框划出的代码,不细述。
所以,Spring Boot Web自动注册就是通过以上两步:1)servlet自动初始化;2)servlet自动注册到容器servletContext中——至此,Spring MVC自动配置完成并可以在诸如tomcat的容器中使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?