当前位置: 首页 > article >正文

Spring 框架中适配器模式的五大典型应用场景

Spring 框架中适配器模式的应用场景

在 Spring 框架中,适配器模式(Adapter Pattern)被广泛应用于将不同组件的接口转化为统一接口,从而实现组件间的无缝协作。以下是几个典型的应用场景:

1. HandlerAdapter - MVC 请求处理

在 Spring MVC 中,HandlerAdapter 是适配器模式的核心应用,用于将不同类型的处理器(Handler)统一为可执行的接口。

场景说明

Spring MVC 支持多种处理器类型(如 @ControllerHttpRequestHandlerServlet 等),但 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"; // 默认方法名@Overridepublic void onMessage(Message message, Session session) throws JMSException {// 适配逻辑:将 JMS Message 转换为方法参数并调用目标方法Object convertedMessage = extractMessage(message);invokeListenerMethod(delegate, defaultListenerMethod, new Object[] { convertedMessage });}}

示例配置

@Beanpublic 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; // 目标方法@Overridepublic void onApplicationEvent(ApplicationEvent event) {// 适配逻辑:将事件转换为方法参数并调用if (supportsEvent(event)) {Object[] args = new Object[] { resolveArgument(event) };method.invoke(delegate, args);}}}

示例配置

@Servicepublic 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;@Overridepublic void execute(Runnable task, long startTimeout) {concurrentExecutor.execute(task);}@Overridepublic Future<?> submit(Runnable task) {return concurrentExecutor.submit(task);}// 其他方法...}

5. HandlerInterceptorAdapter - 请求拦截器(已弃用)

在 Spring MVC 中,HandlerInterceptorAdapter 是一个抽象适配器类,用于简化拦截器的实现。

场景说明

Spring 3.2 之前,拦截器需要实现 HandlerInterceptor 接口的所有方法。

关键类

HandlerInterceptorAdapter:提供默认实现,允许子类仅覆盖需要的方法。

public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {return true; // 默认实现}@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView) throws Exception {// 空实现}@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception {// 空实现}}

示例

public class MyInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) {// 只覆盖需要的方法return true;}}

适配器模式在 Spring 中的特点

解耦组件:通过适配器将不同接口统一,使组件间无需依赖具体实现。

增强扩展性:易于添加新的适配器支持新类型,符合开闭原则。

简化使用:用户只需关注核心逻辑,无需实现复杂接口。

广泛应用:在 MVC、消息处理、事件机制等模块中均有体现。

理解这些适配器模式的应用,有助于更深入地掌握 Spring 框架的设计思想和扩展方式。

相关文章:

Spring 框架中适配器模式的五大典型应用场景

Spring 框架中适配器模式的应用场景 在 Spring 框架中&#xff0c;适配器模式&#xff08;Adapter Pattern&#xff09;被广泛应用于将不同组件的接口转化为统一接口&#xff0c;从而实现组件间的无缝协作。以下是几个典型的应用场景&#xff1a; 1. HandlerAdapter - MVC 请…...

【Java ee初阶】jvm(3)

一、双亲委派机制&#xff08;类加载机制中&#xff0c;最经常考到的问题&#xff09; 类加载的第一个环节中&#xff0c;根据类的全限定类名&#xff08;包名类名&#xff09;找到对应的.class文件的过程。 JVM中进行类加载的操作&#xff0c;需要以来内部的模块“类加载器”…...

C 语言多维数组:定义、初始化与访问的深度解析

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在 C 语言中,我们已经熟悉了一维数组(存储线性数据)和二维数组(存储表格或矩阵数据)。但现实世界的数据结构往往更加复杂,例如表示空间中的点、图像数据、物理模拟的网格等。这时,就需要用到多维数…...

浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)

JavaScript&#xff08;ECMAScript&#xff09;的发展经历了多个版本&#xff0c;每个版本都引入了新特性和改进。以下仅是对三个常用版本&#xff08;ES5、ES6&#xff08;ES2015&#xff09; 和 ES2023&#xff09;的基本对比及使用建议&#xff1a; 目前常见项目中还是用ES6…...

23种设计模式考试趋势分析之——适配器(Adapter)设计模式——求三连

文章目录 一、考点分值占比与趋势分析二、真题考点深入挖掘三、"wwwh"简述四、真题演练与解析五、极简备考笔记 适配器模式核心要点六、考点记忆顺口溜七、多角度解答 一、考点分值占比与趋势分析 由于知识库提供的真题年份信息不完整&#xff0c;我们仅能对现有数据…...

Python 翻译词典小程序

一、概述 本工具是基于Python开发的智能翻译系统&#xff0c;采用有道词典进行翻译&#xff0c;并具有本地词典缓存以及单词本功能。 版本号&#xff1a;v1.0 (2025-05-15) 二、核心功能说明 1. 基础翻译功能 即时翻译&#xff1a;输入英文单词自动获取中文释义 词性识别&…...

【Linux笔记】——线程互斥与互斥锁的封装

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;【Linux笔记】——Linux线程封装 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、线程互斥的概念二、互…...

Android屏幕采集编码打包推送RTMP技术详解:从开发到优化与应用

在现代移动应用中&#xff0c;屏幕采集已成为一个广泛使用的功能&#xff0c;尤其是在实时直播、视频会议、远程教育、游戏录制等场景中&#xff0c;屏幕采集技术的需求不断增长。Android 平台为开发者提供了 MediaProjection API&#xff0c;这使得屏幕录制和采集变得更加简单…...

【深度学习】残差网络(ResNet)

如果按照李沐老师书上来&#xff0c;学完 VGG 后还有 NiN 和 GoogLeNet 要学&#xff0c;但是这两个我之前听都没听过&#xff0c;而且我看到我导师有发过 ResNet 相关的论文&#xff0c;就想跳过它们直接看后面的内容。 现在看来这不算是不踏实&#xff0c;因为李沐老师说如果…...

《Python星球日记》 第94天:走近自动化训练平台

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、自动化训练平台简介1. Kubeflow Pipelines2. TensorFlow Extended (TFX) 二…...

S7 200 smart连接Profinet转ModbusTCP网关与西门子1200PLC配置案例

控制要求&#xff1a;使用MODBUSTCP通信进行两台PLC之间的数据交换&#xff0c;由于改造现场不能改动程序&#xff0c;只留出了对应的IQ地址。于是客户决定使用网关进行通讯把数据传到plc。 1、读取服务器端40001~40005地址中的数据&#xff0c;放入到VW200~VW208中&#xff1…...

React中巧妙使用异步组件Suspense优化页面性能。

文章目录 前言一、为什么需要异步组件&#xff1f;1. 性能瓶颈分析2. 异步组件的价值 二、核心实现方式1. React.lazy Suspense&#xff08;官方推荐&#xff09;2. 路由级代码分割&#xff08;React Router v6&#xff09; 总结 前言 在 React 应用中&#xff0c;随着功能复…...

学习笔记:黑马程序员JavaWeb开发教程(2025.4.7)

12.9 登录校验-Filter-入门 /*代表所有&#xff0c;WebFilter&#xff08;urlPatterns “/*”&#xff09;代表拦截所有请求 Filter是JavaWeb三大组件&#xff0c;不是SpringBoot提供的&#xff0c;要在SpringBoot里面使用JavaWeb&#xff0c;则需要加上ServletComponentScan注…...

11 web 自动化之 DDT 数据驱动详解

文章目录 一、DDT 数据驱动介绍二、实战 一、DDT 数据驱动介绍 数据驱动&#xff1a; 现在主流的设计模式之一&#xff08;以数据驱动测试&#xff09; 结合 unittest 框架如何实现数据驱动&#xff1f; ddt 模块实现 数据驱动的意义&#xff1a; 通过不同的数据对同一脚本实现…...

OpenCV-python灰度变化和直方图修正类型

实验1 实验内容 该段代码旨在读取名为"test.png"的图像&#xff0c;并将其转换为灰度图像。使用加权平均值法将原始图像的RGB值转换为灰度值。 代码注释 image cv.imread("test.png")h np.shape(image)[0] w np.shape(image)[1] gray_img np.zeros…...

从 Excel 到 Data.olllo:数据分析师的提效之路

背景&#xff1a;Excel 的能力边界 对许多数据分析师而言&#xff0c;Excel 是入门数据处理的第一工具。然而&#xff0c;随着业务数据量的增长&#xff0c;Excel 的一些固有限制逐渐显现&#xff1a; 操作容易出错&#xff0c;难以审计&#xff1b; 打开或操作百万行数据时&…...

图像定制大一统?字节提出DreamO,支持人物生成、 ID保持、虚拟试穿、风格迁移等多项任务,有效解决多泛化性冲突。

字节提出了一个统一的图像定制框架DreamO&#xff0c;支持人物生成、 ID保持、虚拟试穿、风格迁移等多项任务&#xff0c;不仅在广泛的图像定制场景中取得了高质量的结果&#xff0c;而且在适应多条件场景方面也表现出很强的灵活性。现在已经可以支持消费级 GPU&#xff08;16G…...

Nginx 动静分离在 ZKmall 开源商城静态资源管理中的深度优化

在 B2C 电商高并发场景下&#xff0c;静态资源&#xff08;图片、CSS、JavaScript 等&#xff09;的高效管理直接影响页面加载速度与用户体验。ZKmall开源商城通过对 Nginx 动静分离技术的深度优化&#xff0c;将静态资源响应速度提升 65%&#xff0c;带宽成本降低 40%&#xf…...

在vs code 中无法运行npm并报无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查

问题&#xff1a; npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查 原因&#xff1a; 可能是环境变量未正确继承或终端配置不一致 解决方法&#xff1a; 1.找到自己的node.js的版本号 2.重新下载node.js 下载 node.js - https://nodejs.p…...

分布式2(限流算法、分布式一致性算法、Zookeeper )

目录 限流算法 固定窗口计数器&#xff08;Fixed Window Counter&#xff09; 滑动窗口计数器&#xff08;Sliding Window Counter&#xff09; 漏桶算法&#xff08;Leaky Bucket&#xff09; 令牌桶算法&#xff08;Token Bucket&#xff09; 令牌桶与漏桶的对比 分布式…...

2089. 找出数组排序后的目标下标——O(n)做法!

本题要求在一个已排序的数组 nums 中&#xff0c;找出所有等于目标值 target 的元素下标。若不存在这样的元素&#xff0c;则返回 {-1, -1}。解决该问题有两种主要方法&#xff1a;二分查找法和统计计数法。 二分查找法&#xff1a;首先对数组进行排序&#xff0c;然后通过二分…...

ARM A64 LDR指令

ARM A64 LDR指令 1 LDR (immediate)1.1 Post-index1.2 Pre-index1.3 Unsigned offset 2 LDR (literal)3 LDR (register)4 其他LDR指令变体4.1 LDRB (immediate)4.1.1 Post-index4.1.2 Pre-index4.1.3 Unsigned offset 4.2 LDRB (register)4.3 LDRH (immediate)4.3.1 Post-index…...

给大模型“贴膏药”:LoRA微调原理说明书

一、前言&#xff1a;当AI模型开始“叛逆” 某天&#xff0c;我决定教deepseek说方言。 第一次尝试&#xff08;传统微调&#xff09;&#xff1a; 我&#xff1a;给deepseek灌了100G东北小品数据集&#xff0c;训练三天三夜。结果&#xff1a;AI确实会喊“老铁666”了…但英…...

Spring-messaging-MessageHandler接口实现类ServiceActivatingHandler

ServiceActivatingHandler实现了MessageHandler接口&#xff0c;所以它是一个MessageHandler&#xff0c;在spring-integration中&#xff0c;它也叫做服务激活器&#xff08;Service Activitor&#xff09;&#xff0c;因为这个类是依赖spring容器BeanFactory的&#xff0c;所…...

asp.net core api RESTful 风格控制器

在 ASP.NET Core API 中&#xff0c;遵循 RESTful 风格的控制器一般具备以下几个关键特征&#xff1a; ✅ RESTful 风格控制器的命名规范 控制器命名 使用 复数名词&#xff0c;表示资源集合&#xff0c;如 ProductsController、UsersController。 路由风格 路由使用 [Rout…...

【甲方安全建设】Python 项目静态扫描工具 Bandit 安装使用详细教程

文章目录 一、工具简介二、工具特点1.聚焦安全漏洞检测2.灵活的扫描配置3.多场景适配4.轻量且社区活跃三、安装步骤四、使用方法场景1:扫描单个Python文件场景2:递归扫描整个项目目录五、结果解读六、总结一、工具简介 Bandit 是由Python官方推荐的静态代码分析工具(SAST)…...

实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)

实习记录小程序 目录 基于SSM的习记录小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码…...

老旧设备升级利器:Modbus TCP转 Profinet让能效监控更智能

在工业自动化领域&#xff0c;ModbusTCP和Profinet是两种常见的通讯协议。Profinet是西门子公司推出的基于以太网的实时工业以太网标准&#xff0c;而Modbus则是由施耐德电气提出的全球首个真正开放的、应用于电子控制器上的现场总线协议。这两种协议各有各的优点&#xff0c;但…...

【从基础到模型网络】深度学习-语义分割-ROI

在语义分割中&#xff0c;ROI&#xff08;Region of Interest&#xff0c;感兴趣区域&#xff09;是图像中需要重点关注的部分。其作用包括&#xff1a;提高效率&#xff0c;减少高分辨率图像的计算量&#xff1b;增强分割精度&#xff0c;聚焦关键语义信息&#xff1b;减少背景…...

Qt控件:交互控件

交互控件 1. QAction核心功能API 1.2 实例应用情况应用场景 1.3 QAction与QPushButton/QToolButton关系QActionQPushButtonQToolButton三者关系 1. QAction ##1. 1简介与API QAction 是一个核心类&#xff0c;用于表示应用程序中的一个操作&#xff08;如菜单项、工具栏按钮或…...