Spring 框架中适配器模式的应用场景
在 Spring 框架中,适配器模式(Adapter Pattern)被广泛应用于将不同组件的接口转化为统一接口,从而实现组件间的无缝协作。以下是几个典型的应用场景:
1. HandlerAdapter - MVC 请求处理
在 Spring MVC 中,HandlerAdapter
是适配器模式的核心应用,用于将不同类型的处理器(Handler)统一为可执行的接口。
场景说明
Spring MVC 支持多种处理器类型(如 @Controller
、HttpRequestHandler
、Servlet
等),但 DispatcherServlet
需要以统一方式调用这些处理器。
关键类
HandlerAdapter 接口:定义统一的处理方法。
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
具体适配器实现:
RequestMappingHandlerAdapter
:处理 @Controller
和 @RequestMapping
注解的方法。
SimpleControllerHandlerAdapter
:处理实现 Controller
接口的处理器。
HttpRequestHandlerAdapter
:处理实现 HttpRequestHandler
的处理器。
工作流程
DispatcherServlet
接收到请求后,找到对应的 Handler。
通过 HandlerAdapter
判断该 Handler 是否被支持。
调用 HandlerAdapter.handle()
方法,统一处理请求。
示例
// DispatcherServlet 中简化的请求处理逻辑
HandlerAdapter adapter = getHandlerAdapter(handler);
ModelAndView mv = adapter.handle(request, response, handler);
2. MessageListenerAdapter - JMS 消息处理
在 Spring JMS 中,MessageListenerAdapter
将自定义的消息处理方法适配为 JMS 规范的 MessageListener
接口。
场景说明
JMS 要求消息监听器实现 MessageListener
接口,但用户可能希望使用自定义方法名和参数类型处理消息。
关键类
MessageListenerAdapter:实现 MessageListener
接口,并将消息委托给目标方法。
public class MessageListenerAdapter implements MessageListener, SessionAwareMessageListener<Message> {
private Object delegate; // 委托对象
private String defaultListenerMethod = "handleMessage"; // 默认方法名
@Override
public void onMessage(Message message, Session session) throws JMSException {
// 适配逻辑:将 JMS Message 转换为方法参数并调用目标方法
Object convertedMessage = extractMessage(message);
invokeListenerMethod(delegate, defaultListenerMethod, new Object[] { convertedMessage });
}
}
示例配置
@Bean
public MessageListenerAdapter listenerAdapter(MyMessageHandler handler) {
MessageListenerAdapter adapter = new MessageListenerAdapter(handler);
adapter.setDefaultListenerMethod("processMessage"); // 指定方法名
return adapter;
}
3. ApplicationListenerAdapter - 事件监听器适配
在 Spring 事件机制中,ApplicationListenerAdapter
将任意 Bean 的方法适配为事件监听器。
场景说明
用户可能希望使用非 ApplicationListener
实现类的方法来处理事件。
关键类
ApplicationListenerAdapter:实现 ApplicationListener
接口,将事件委托给目标 Bean 的方法。
public class ApplicationListenerAdapter implements ApplicationListener<ApplicationEvent>, Ordered {
private final Object delegate; // 委托对象
private final Method method; // 目标方法
@Override
public void onApplicationEvent(ApplicationEvent event) {
// 适配逻辑:将事件转换为方法参数并调用
if (supportsEvent(event)) {
Object[] args = new Object[] { resolveArgument(event) };
method.invoke(delegate, args);
}
}
}
示例配置
@Service
public class MyService {
@EventListener // 方法会被 ApplicationListenerAdapter 适配
public void handleEvent(MyEvent event) {
// 处理事件
}
}
4. AsyncTaskExecutorAdapter - 任务执行器适配
在 Spring 异步处理中,AsyncTaskExecutorAdapter
将 JDK 的 Executor
适配为 Spring 的 AsyncTaskExecutor
。
场景说明
用户可能已有 JDK 原生的 Executor
,但希望在 Spring 环境中使用。
关键类
AsyncTaskExecutorAdapter:实现 AsyncTaskExecutor
接口,委托给 JDK Executor
。
public class AsyncTaskExecutorAdapter implements AsyncTaskExecutor {
private final Executor concurrentExecutor;
@Override
public void execute(Runnable task, long startTimeout) {
concurrentExecutor.execute(task);
}
@Override
public Future<?> submit(Runnable task) {
return concurrentExecutor.submit(task);
}
// 其他方法...
}
5. HandlerInterceptorAdapter - 请求拦截器(已弃用)
在 Spring MVC 中,HandlerInterceptorAdapter
是一个抽象适配器类,用于简化拦截器的实现。
场景说明
Spring 3.2 之前,拦截器需要实现 HandlerInterceptor
接口的所有方法。
关键类
HandlerInterceptorAdapter:提供默认实现,允许子类仅覆盖需要的方法。
public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
return true; // 默认实现
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
// 空实现
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
// 空实现
}
}
示例
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// 只覆盖需要的方法
return true;
}
}
适配器模式在 Spring 中的特点
解耦组件:通过适配器将不同接口统一,使组件间无需依赖具体实现。
增强扩展性:易于添加新的适配器支持新类型,符合开闭原则。
简化使用:用户只需关注核心逻辑,无需实现复杂接口。
广泛应用:在 MVC、消息处理、事件机制等模块中均有体现。
理解这些适配器模式的应用,有助于更深入地掌握 Spring 框架的设计思想和扩展方式。