Spring MVC简介
Spring Web的MVC框架旨在全面处理HTTP请求,它具备以下特性:
-
可配置的处理程序映射:允许开发者根据需要将特定的URL路径映射到相应的处理程序上。
-
视图解析:框架能够根据处理程序返回的逻辑视图名,解析并渲染最终的视图(如JSP或Thymeleaf模板)。
-
本地化和主题解析:支持多语言内容的处理,以及根据用户偏好或会话数据动态设置应用的主题。
-
文件上传支持:简化了文件上传的处理过程,使得处理用户上传的文件变得更加简单。
-
默认基于注解的处理程序:通过@Controller和@RequestMapping等注解,开发者可以轻松地定义请求的处理逻辑。
-
灵活的请求处理:支持多种方法(如GET、POST等)和不同的参数绑定方式,以适应多样化的请求处理需求。
Spring Web MVC的请求处理工作流程可以通过一张图来展示,这张图清晰地描述了从接收请求到返回响应的全过程。
在Spring中可以在web.xml中用以下的方式注入bean
<web-app>
<servlet>
<servlet-name>golfing</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>golfing</servlet-name>
<url-pattern>/golfing/*</url-pattern>
</servlet-mapping>
</web-app>
在Spring Boot框架中,我们无需手动配置许多组件,因为它们已经通过自动化配置机制得到了默认的设置。因此,本文将专注于探究DispatcherServlet这一核心组件是如何被自动注入和配置的。我们将深入了解Spring Boot如何简化了传统Spring应用中需要显式声明和配置的bean的创建过程。
Spring Boot自动注入
基于Spring Boot自动注入管理bean,都会实现一个autoconfigure的模块,Spring Boot提供的@AutoConfiguration进行自动注入。如下图所示,Spring Boot就实现了spring-boot-autoconfigure,Spring Boot Actuator则实现了一个spring-boot-actuator-autoconfigure的模块。
在autoconfiure模块中会通过META-INF/spring.factories配置Configuration,Spring Boot会自动扫描该路径下面的每一个类。
在META-INF/spring-autoconfigure-metadata.properties中存储自动装配类的过滤计算规则。
在META-INF/spring-configuration-metadata.json、META-INF/additional-spring-configuration-metadata.json定义所有受支持配置属性的详细信息的元数据文件,用于在配置application.properties提供提示信息。之所有有两个文件是因为从spring boot2.7开始,慢慢不支持META-INF/spring.factories文件了需要导入的自动配置类可以放在/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中
另外还有META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,跟spring.factories作用一致。
而我们今天的重点DispatcherServlet则是通过DispatcherServletAutoConfiguration进行注入的。
如上图,DispatcherServletAutoConfiguration使用了四个注解进行管理。每个注解含义如下:
@AutoConfigureOrder:对自动配置类进行排序,Spring MVC 定义的顺序如下:@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@AutoConfiguration:自动注入配置类,Spring MVC配置的源码如下:@AutoConfiguration(after = ServletWebServerFactoryAutoConfiguration.class)
@ConditionalOnWebApplication:当应用程序是web应用程序时匹配的条件,Spring MVC配置的源码如下:@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass:只有满足条件时才加载指定的类。Spring MVC配置的源码如下:@ConditionalOnClass(DispatcherServlet.class)
最后就是在DispatcherServletAutoConfiguration通过@Bean的方式注入DispatcherServlet,源码如下:
@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());
dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());
dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());
dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());
dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());
return dispatcherServlet;
}
总结
在实际应用中,通过Spring Boot实现DispatcherServlet的自动注入极大地简化了开发流程。以往在传统Spring应用中,配置DispatcherServlet涉及到XML文件或Java配置类中的多个步骤,而现在,这些只需依赖于Spring Boot的自动配置即可完成。
通过学习源码,我了解到了Spring Boot自动配置的底层机制,包括条件注解和自动配置类如DispatcherServletAutoConfiguration。这些知识对于我想要自定义自动配置或在遇到问题时进行调试是非常有用的。