HandlerAdapter
在 Spring MVC 中,HandlerAdapter(处理器适配器)是核心组件之一,它在前端请求与后端处理器(Handler)之间扮演着 “桥梁” 角色。由于 Spring MVC 支持多种类型的处理器(如控制器类、方法、Servlet 等),HandlerAdapter 的主要作用是屏蔽不同处理器类型的差异,统一提供执行处理器的接口,使 DispatcherServlet(前端控制器)无需关心具体处理器的调用细节。
核心作用
- 适配不同类型的处理器:Spring MVC 支持多种处理器(如
@Controller标注的类、实现Controller接口的类、HttpRequestHandler等),HandlerAdapter负责根据处理器类型选择对应的适配器,调用处理器的逻辑。 - 统一调用接口:无论处理器类型如何,
HandlerAdapter都通过handle()方法执行处理器,返回ModelAndView(或其他响应结果),简化了DispatcherServlet的逻辑。
主要实现类
Spring MVC 内置了多种 HandlerAdapter 实现,分别对应不同类型的处理器,常见的有:
RequestMappingHandlerAdapter最常用的适配器,用于处理通过@RequestMapping注解定义的处理器方法(即@Controller类中的请求映射方法)。支持参数绑定、数据校验、返回值解析等功能,是 Spring MVC 注解驱动开发的核心适配器。SimpleControllerHandlerAdapter用于处理实现了Controller接口的处理器(传统风格的控制器)。Controller接口只有一个handleRequest()方法,返回ModelAndView。HttpRequestHandlerAdapter用于处理实现了HttpRequestHandler接口的处理器。该接口的handleRequest()方法直接操作HttpServletRequest和HttpServletResponse,通常用于返回二进制数据(如文件下载)。SimpleServletHandlerAdapter用于处理Servlet实例(通过Servlet作为处理器)。适配Servlet的service()方法。
工作流程
DispatcherServlet接收到请求后,通过HandlerMapping找到对应的Handler(处理器)。DispatcherServlet遍历所有注册的HandlerAdapter,调用supports(handler)方法判断该适配器是否支持当前处理器。- 找到匹配的
HandlerAdapter后,调用其handle(request, response, handler)方法执行处理器逻辑。 HandlerAdapter执行完成后,返回ModelAndView(或其他结果)给DispatcherServlet,后续由视图解析器处理视图渲染。
自定义 HandlerAdapter
如果需要支持自定义类型的处理器,可以通过以下步骤实现:
- 定义自定义处理器(如实现特定接口或注解)。
- 实现
HandlerAdapter接口,重写supports()(判断是否支持自定义处理器)和handle()(执行处理器逻辑)方法。 - 将自定义
HandlerAdapter注册到 Spring 容器(如通过@Bean注解)。
总结
HandlerAdapter 是 Spring MVC 中 “适配器模式” 的典型应用,通过统一接口适配不同类型的处理器,降低了 DispatcherServlet 与具体处理器的耦合度,使框架更具扩展性。在实际开发中,最常用的是 RequestMappingHandlerAdapter,它支撑了基于 @Controller 和 @RequestMapping 的注解式开发。
