Spring MVC是Spring框架中用于构建Web应用程序的核心模块,它基于经典的MVC(Model-View-Controller)设计模式,提供了一套灵活、强大的Web开发框架。本文将深入剖析Spring MVC的核心原理、工作流程和关键组件。
一、Spring MVC架构概述
1.1 MVC设计模式
Spring MVC实现了MVC模式的Web层解决方案:
- Model(模型):封装应用数据及业务逻辑(通常由Service层提供)
- View(视图):负责数据展示(JSP、Thymeleaf、FreeMarker等)
- Controller(控制器):接收用户请求,协调Model和View
1.2 Spring MVC核心架构
Spring MVC采用了”前端控制器”模式,其核心架构如下:
HTTP Request
↓
DispatcherServlet (前端控制器)
↓
HandlerMapping (映射处理器)
↓
Controller (处理器)
↓
ModelAndView (模型和视图)
↓
ViewResolver (视图解析器)
↓
View (视图渲染)
↓
HTTP Response
二、核心组件解析
2.1 DispatcherServlet
前端控制器,是Spring MVC的核心入口,负责请求的分发和协调:
public class DispatcherServlet extends FrameworkServlet {
// 核心处理流程
protected void doService(HttpServletRequest request, HttpServletResponse response) {
// 请求处理主逻辑
}
// 实际处理请求的方法
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
// 1. 获取Handler
// 2. 获取HandlerAdapter
// 3. 执行拦截器preHandle
// 4. 实际调用处理器方法
// 5. 处理返回值
// 6. 渲染视图
}
}
2.2 九大核心组件
Spring MVC工作流程依赖于以下核心组件:
- HandlerMapping:将请求映射到处理器(Controller方法)
RequestMappingHandlerMapping
:处理@RequestMapping
注解BeanNameUrlHandlerMapping
:根据Bean名称映射
- HandlerAdapter:实际调用处理器方法
RequestMappingHandlerAdapter
:处理@Controller
注解类的方法
- HandlerExceptionResolver:处理异常,返回错误视图
- ViewResolver:将逻辑视图名解析为实际视图
InternalResourceViewResolver
:解析JSP视图ThymeleafViewResolver
:解析Thymeleaf模板
- LocaleResolver:国际化解析
- ThemeResolver:主题解析
- MultipartResolver:文件上传解析
- FlashMapManager:管理Flash属性(重定向时传递参数)
- RequestToViewNameTranslator:当没有显式返回视图名时,根据请求生成默认视图名
三、请求处理流程详解
3.1 完整请求处理流程
- 请求到达DispatcherServlet
- 由web.xml或Servlet 3.0+注解配置
- 确定处理器(Handler)
- DispatcherServlet查询所有HandlerMapping
- 返回HandlerExecutionChain(包含处理器和拦截器)
- 确定处理器适配器(HandlerAdapter)
- 根据处理器类型选择合适的HandlerAdapter
- 执行拦截器preHandle方法
- 按顺序执行拦截器的前置处理
- 实际调用处理器方法
- HandlerAdapter调用处理器方法
- 处理参数绑定、数据转换、验证等
- 处理返回值
- 处理
@ResponseBody
、视图名、ModelAndView等不同返回类型
- 执行拦截器postHandle方法
- 逆向执行拦截器的后置处理
- 处理异常(如果有)
- 如果过程中抛出异常,由HandlerExceptionResolver处理
- 渲染视图
- 通过ViewResolver解析视图
- 视图渲染,填充模型数据
- 执行拦截器afterCompletion方法
- 最终执行拦截器的完成回调
3.2 流程时序图
sequenceDiagram
participant Client
participant DispatcherServlet
participant HandlerMapping
participant HandlerAdapter
participant Controller
participant ViewResolver
participant View
Client->>DispatcherServlet: HTTP Request
DispatcherServlet->>HandlerMapping: 查询Handler
HandlerMapping-->>DispatcherServlet: 返回HandlerExecutionChain
DispatcherServlet->>HandlerAdapter: 获取适配器
HandlerAdapter-->>DispatcherServlet: 返回适配器
DispatcherServlet->>HandlerAdapter: 执行Handler
HandlerAdapter->>Controller: 调用处理方法
Controller-->>HandlerAdapter: 返回ModelAndView
HandlerAdapter-->>DispatcherServlet: 返回结果
DispatcherServlet->>ViewResolver: 解析视图
ViewResolver-->>DispatcherServlet: 返回View
DispatcherServlet->>View: 渲染视图
View-->>DispatcherServlet: 渲染结果
DispatcherServlet->>Client: HTTP Response
四、关键机制解析
4.1 参数绑定机制
Spring MVC强大的参数绑定能力是其核心特性之一:
- 基本类型绑定:自动将请求参数绑定到简单类型(String、int等)
- POJO绑定:自动将请求参数绑定到JavaBean属性
- 特殊类型支持:
@RequestParam
:获取单个参数@PathVariable
:获取URI模板变量@RequestBody
:绑定请求体(JSON/XML)@ModelAttribute
:绑定模型属性@RequestHeader
:获取请求头@CookieValue
:获取Cookie值
实现原理:
- 通过
HandlerMethodArgumentResolver
接口实现 - 内置多种解析器如:
RequestParamMethodArgumentResolver
PathVariableMethodArgumentResolver
RequestBodyArgumentResolver
4.2 视图解析机制
视图解析的核心接口:
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
}
public interface View {
void render(@Nullable Map<String, ?> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception;
}
常见视图技术集成:
- JSP/JSTL:
InternalResourceViewResolver
- Thymeleaf:
ThymeleafViewResolver
- FreeMarker:
FreeMarkerViewResolver
- JSON/XML:
MappingJackson2JsonView
等
4.3 拦截器机制
拦截器(Interceptor)提供预处理和后处理能力:
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
@Nullable Exception ex) throws Exception {
}
}
与Filter的区别:
- 作用域不同:Filter是Servlet规范,Interceptor是Spring MVC组件
- 执行时机:Filter在DispatcherServlet之前,Interceptor在DispatcherServlet之后
- 访问能力:Interceptor可以访问Handler和ModelAndView,Filter不能
五、Spring MVC与Spring Boot集成
5.1 Spring Boot中的自动配置
Spring Boot通过WebMvcAutoConfiguration
自动配置Spring MVC:
- 自动配置的ViewResolver:
ContentNegotiatingViewResolver
:内容协商视图解析器BeanNameViewResolver
:Bean名称视图解析器InternalResourceViewResolver
:JSP视图解析器(如果存在)
- 静态资源处理:
/static
,/public
,/resources
,/META-INF/resources
- 可通过
spring.mvc.static-path-pattern
自定义
- 默认消息转换器:
MappingJackson2HttpMessageConverter
(处理JSON)StringHttpMessageConverter
ByteArrayHttpMessageConverter
等
5.2 自定义MVC配置
通过WebMvcConfigurer
接口自定义配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new MyDateFormatter());
}
}
六、Spring MVC高级特性
6.1 异步请求处理
Spring MVC支持多种异步处理模型:
- 基于Callable:
@GetMapping("/async")
public Callable<String> asyncProcessing() {
return () -> {
Thread.sleep(3000);
return "async-result";
};
}
- 基于DeferredResult:
@GetMapping("/deferred")
public DeferredResult<String> deferredProcessing() {
DeferredResult<String> result = new DeferredResult<>();
asyncService.execute(() -> {
result.setResult("deferred-result");
});
return result;
}
- 响应式编程(Spring 5+):
@GetMapping("/flux")
public Flux<String> fluxStream() {
return Flux.just("A", "B", "C")
.delayElements(Duration.ofSeconds(1));
}
6.2 REST支持
Spring MVC提供全面的REST支持:
- 内容协商:
- 根据Accept头或请求扩展名返回不同格式
- 支持JSON、XML等
- HATEOAS:
- 通过
RepresentationModel
实现超媒体驱动 - 支持链接生成
- CORS支持:
@CrossOrigin
注解- 全局CORS配置
6.3 异常处理机制
- 局部异常处理:
@Controller
public class MyController {
@ExceptionHandler(MyException.class)
public ResponseEntity<String> handleMyException(MyException ex) {
return ResponseEntity.badRequest().body(ex.getMessage());
}
}
- 全局异常处理:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleAll(Exception ex) {
ModelAndView mav = new ModelAndView("error");
mav.addObject("message", ex.getMessage());
return mav;
}
}
七、Spring MVC源码分析
7.1 DispatcherServlet初始化
DispatcherServlet
初始化时加载的组件:
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); // 文件上传解析器
initLocaleResolver(context); // 国际化解析器
initThemeResolver(context); // 主题解析器
initHandlerMappings(context); // 处理器映射
initHandlerAdapters(context); // 处理器适配器
initHandlerExceptionResolvers(context); // 异常解析器
initRequestToViewNameTranslator(context); // 视图名转换器
initViewResolvers(context); // 视图解析器
initFlashMapManager(context); // FlashMap管理器
}
7.2 请求处理核心流程
doDispatch
方法核心逻辑:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
// 1. 获取HandlerExecutionChain
mappedHandler = getHandler(processedRequest);
// 2. 获取HandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 执行拦截器preHandle
if (!mappedHandler.applyPreHandle(processedRequest, response)) return;
// 4. 实际处理请求
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 5. 应用默认视图名
applyDefaultViewName(processedRequest, mv);
// 6. 执行拦截器postHandle
mappedHandler.applyPostHandle(processedRequest, response, mv);
// 7. 处理结果(渲染视图或处理异常)
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
八、性能优化建议
- 合理使用拦截器:
- 避免在拦截器中执行耗时操作
- 按需注册拦截器,减少不必要的拦截
- 视图解析优化:
- 缓存视图解析结果
- 避免过多的视图解析器
- 静态资源处理:
- 使用CDN托管静态资源
- 配置缓存头
- 消息转换器优化:
- 按需配置消息转换器
- 使用高效的JSON库(如Jackson)
- 异步处理:
- 对耗时操作使用异步处理
- 合理配置线程池
结语
Spring MVC作为企业级Java Web开发的事实标准,其设计精良、功能强大且高度可扩展。理解其核心原理和工作机制,有助于开发者更高效地使用框架,并在遇到问题时能够快速定位和解决。随着Spring框架的不断演进,Spring MVC也在持续增强,如对响应式编程的支持、更灵活的函数式端点定义等,值得开发者持续关注和学习。