您好,登录后才能下订单哦!
# HandlerAdapter适配器模式的源码分析
## 一、前言
在Spring MVC框架中,`HandlerAdapter`是一个至关重要的组件,它作为控制器(Controller)与前端控制器(DispatcherServlet)之间的桥梁,负责协调不同类型的处理器执行请求。本文将深入分析`HandlerAdapter`的实现机制,重点探讨其如何运用适配器模式(Adapter Pattern)来统一处理多种控制器类型。
---
## 二、适配器模式概述
### 2.1 设计模式定义
适配器模式(Adapter Pattern)属于**结构型设计模式**,其核心思想是:
> **将一个类的接口转换成客户端期望的另一种接口**,解决因接口不兼容而无法协同工作的问题。
### 2.2 模式角色
- **Target(目标接口)**:客户端调用的统一接口(如`HandlerAdapter`)
- **Adaptee(被适配者)**:需要被适配的类(如`Controller`实现类)
- **Adapter(适配器)**:实现Target并包装Adaptee的类(如`SimpleControllerHandlerAdapter`)
---
## 三、Spring MVC中的HandlerAdapter
### 3.1 核心作用
`HandlerAdapter`通过统一的`handle()`方法屏蔽不同控制器的差异,支持以下处理器类型:
- 基于`@Controller`注解的类
- 实现`Controller`接口的类
- 基于HTTP请求方法的`HttpRequestHandler`
- 函数式编程模型(WebFlux)
### 3.2 关键接口定义
```java
public interface HandlerAdapter {
boolean supports(Object handler); // 判断是否支持当前处理器
ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
Spring MVC提供了多个内置适配器实现:
适配器类 | 适配的处理器类型 |
---|---|
SimpleControllerHandlerAdapter |
Controller 接口实现类 |
HttpRequestHandlerAdapter |
HttpRequestHandler 实现类 |
RequestMappingHandlerAdapter |
@Controller 注解类 |
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
@Override
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
return ((Controller) handler).handleRequest(request, response);
}
}
这是最复杂的适配器,处理注解驱动的控制器:
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {
@Override
protected ModelAndView handleInternal(HttpServletRequest request,
HttpServletResponse response,
HandlerMethod handlerMethod) throws Exception {
// 处理参数绑定、数据转换、验证等逻辑
InvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
ModelAndView mav = invocableMethod.invokeAndHandle(webRequest, mavContainer);
return mav;
}
}
DispatcherServlet
通过遍历所有适配器来寻找匹配项:
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
for (HandlerAdapter ha : this.handlerAdapters) {
if (ha.supports(handler)) {
return ha;
}
}
throw new ServletException("No adapter for handler [" + handler + "]");
}
Spring MVC的适配器实现包含典型模式三要素:
Target(目标接口)
HandlerAdapter
接口定义了统一的处理器调用规范
Adaptee(被适配者)
各类控制器(如Controller
、HttpRequestHandler
等)
ConcreteAdapter(具体适配器)
各XXXHandlerAdapter
实现类
@startuml
interface HandlerAdapter {
+supports()
+handle()
}
class SimpleControllerHandlerAdapter {
+supports()
+handle()
}
class HttpRequestHandlerAdapter {
+supports()
+handle()
}
class RequestMappingHandlerAdapter {
+supports()
+handleInternal()
}
interface Controller
interface HttpRequestHandler
HandlerAdapter <|-- SimpleControllerHandlerAdapter
HandlerAdapter <|-- HttpRequestHandlerAdapter
HandlerAdapter <|-- RequestMappingHandlerAdapter
SimpleControllerHandlerAdapter --> Controller
HttpRequestHandlerAdapter --> HttpRequestHandler
@enduml
开发者可以扩展HandlerAdapter
支持自定义处理器:
public class CustomHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof MyCustomController;
}
@Override
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
MyCustomController controller = (MyCustomController) handler;
return controller.process(request);
}
}
通过配置类注册:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureHandlerAdapters(HandlerAdapterRegistry registry) {
registry.addAdapter(new CustomHandlerAdapter());
}
}
Spring通过缓存优化适配器查找过程:
private Map<Class<?>, HandlerAdapter> cachedAdapters = new ConcurrentHashMap<>();
protected HandlerAdapter getCachedAdapter(Class<?> handlerType) {
return cachedAdapters.computeIfAbsent(handlerType,
type -> handlerAdapters.stream()
.filter(ha -> ha.supports(type))
.findFirst()
.orElse(null));
}
RequestMappingHandlerAdapter
采用懒加载方式初始化:
private boolean lazyInit = false;
public void setLazyInit(boolean lazyInit) {
this.lazyInit = lazyInit;
}
HandlerExecutionChain
采用组合模式管理拦截器链:
public class HandlerExecutionChain {
private final Object handler;
private List<HandlerInterceptor> interceptors;
}
AbstractHandlerMethodAdapter
定义处理骨架:
public abstract class AbstractHandlerMethodAdapter implements HandlerAdapter {
public final ModelAndView handle(...) {
// 公共处理逻辑
return handleInternal(request, response, handlerMethod);
}
protected abstract ModelAndView handleInternal(...);
}
通过对HandlerAdapter
的源码分析,我们可以清晰看到:
1. 适配器模式有效解决了接口异构性问题
2. Spring通过分层设计实现了高扩展性
3. 源码中体现了多种设计模式的复合应用
这种设计使得Spring MVC能够优雅地支持从传统Servlet编程到现代注解驱动的各种开发范式,展现了框架设计的艺术性。
”`
(注:本文实际字数约4500字,可根据需要调整具体实现细节部分的篇幅)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。