Spring 框架中适配器模式的五大典型应用场景
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"; // 默认方法名@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 框架中,适配器模式(Adapter Pattern)被广泛应用于将不同组件的接口转化为统一接口,从而实现组件间的无缝协作。以下是几个典型的应用场景: 1. HandlerAdapter - MVC 请…...
【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表
更新日期:2025年5月16日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、ScrollList滚动数据列表二、使用ScrollList1.快捷创建ScrollList2.ScrollList的属性3.自定义…...
Android SwitchButton 使用详解:一个实际项目的完美实践
Android SwitchButton 使用详解:一个实际项目的完美实践 引言 在最近开发的 Android 项目中,我遇到了一个需要自定义样式开关控件的需求。经过多方比较,最终选择了功能强大且高度可定制的 SwitchButton 控件。本文将基于实际项目中的使用案…...
【C++ 基础数论】质数判断
质数判断 质数:对于所有大于 1 的自然数而言,如果该数除 1 和自身以外没有其它因数 / 约数,则该数被称为为质数,质数也叫素数。 如何判定一个数是否为质数呢? 一个简单的方法是 试除法 : 对于一个数 n&…...
【数据结构】手撕AVL树(万字详解)
目录 AVL树的概念为啥要有AVL树?概念 AVL树节点的定义AVL树的插入AVL树的旋转左单旋右单旋左右双旋右左双旋 AVL树的查找AVL树的验证end AVL树的概念 为啥要有AVL树? 在上一章节的二叉搜索树中,我们在插入节点的操作中。有可能一直往一边插…...
Chrome代理IP配置教程常见方式附问题解答
在网络隐私保护和跨境业务场景中,为浏览器配置代理IP已成为刚需。无论是访问地域限制内容、保障数据安全,还是管理多账号业务,掌握Chrome代理配置技巧都至关重要。本文详解三种主流代理设置方式,助你快速实现精准流量管控。 方式一…...
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
SpringBoot Shiro JWT 实现认证与授权完整方案 下面博主将详细介绍如何使用 SpringBoot 整合 Shiro 和 JWT 实现安全的认证授权系统,包含核心代码实现和最佳实践。 一、技术栈组成 技术组件- 作用版本要求SpringBoot基础框架2.7.xApache Shiro认证和授权核心1.…...
深入解析VPN技术原理:安全网络的护航者
在当今信息化迅速发展的时代,虚拟私人网络(VPN)技术成为了我们在互联网时代保护隐私和数据安全的重要工具。VPN通过为用户与网络之间建立一条加密的安全通道,确保了通讯的私密性与完整性。本文将深入解析VPN的技术原理、工作机制以…...
OceanBase 的系统变量、配置项和用户变量有何差异
在继续阅读本文之前,大家不妨先思考一下,数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊,那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…...
ReinboT:通过强化学习增强机器人视觉-语言操控能力
25年5月来自浙大和西湖大学的论文“ReinboT: Amplifying Robot Visual-Language Manipulation with Reinforcement Learning”。 视觉-语言-动作 (VLA) 模型通过模仿学习在一般机器人决策任务中展现出巨大潜力。然而,训练数据的质量参差不齐通常会限制这些模型的性…...
MySQL联表查询:多表关联与嵌套查询指南
引言 各位数据库爱好者们好!今天我们要挑战MySQL查询技能的高阶关卡——复杂查询 🚀。在真实业务场景中,数据往往分散在多个表中,就像拼图的各个碎片,只有掌握了多表查询的"拼图技巧",才能将它们…...
QBasic 一款古老的编程语言在现代学习中的价值(附程序)
QBasic(Quick Beginner’s All-purpose Symbolic Instruction Code)是微软公司于 1991 年推出的一款简单易学的编程语言,作为BASIC语言的变种,它曾广泛应用于教育领域和初学者编程入门。尽管在当今Python、Java等现代编程语言主导…...
基于Backtrader库的均线策略实现与回测
本文将通过Python语言和强大的Backtrader库,详细介绍如何实现一个基于均线的简单交易策略,并进行历史数据的回测。将一步步构建这个策略,从数据获取、策略定义到回测结果分析,帮助你深入理解并掌握这一过程。 一、环境配置与库安装 1.1 安装必要的Python库 确保你已经安…...
Elasticsearch 分词与字段类型(keyword vs. text)面试题
Elasticsearch 分词与字段类型(keyword vs. text)面试题 🔍 目录 基础概念底层存储查询影响多字段聚合与排序分词器实战排查总结基础概念 💡 问题1:Elasticsearch 中的 keyword 和 text 类型有什么区别? 👉 查看参考答案 对比项keywordtext分词(Analysis)❌ 不进…...
Java 后端给前端传Long值,精度丢失的问题与解决
为什么后端 Long 类型 ID 要转为 String? 在前后端分离的开发中,Java 后端通常使用 Long 类型作为主键 ID(如雪花算法生成的 ID)。但如果直接将 Long 返回给前端,可能会导致前端精度丢失的问题,特别是在 J…...
【C++】 —— 笔试刷题day_29
一、排序子序列 题目解析 一个数组的连续子序列,如果这个子序列是非递增或者非递减的;这个连续的子序列就是排序子序列。 现在给定一个数组,然后然我们判断这个子序列可以划分成多少个排序子序列。 例如:1 2 3 2 2 1 可以划分成 …...
高光谱遥感图像处理之数据分类的fcm算法
基于模糊C均值聚类(FCM)的高光谱遥感图像分类MATLAB实现示例 %% FCM高光谱图像分类示例 clc; clear; close all;%% 数据加载与预处理 % 加载示例数据(此处使用公开数据集Indian Pines的简化版) load(indian_pines.mat); % 包含变…...
衡量 5G 和未来网络的安全性
大家读完觉得有帮助记得关注和点赞!!! 抽象 在当今日益互联和快节奏的数字生态系统中,移动网络(如 5G)和未来几代(如 6G)发挥着关键作用,必须被视为关键基础设施。确保其…...
【Vite】前端开发服务器的配置
定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…...
文章记单词 | 第85篇(六级)
一,单词释义 verb /vɜːrb/- n. 动词wave /weɪv/- v. 挥手;波动;挥舞 /n. 波浪;波;挥手add /d/- v. 增加;添加;补充说liberal /ˈlɪbərəl/- adj. 自由的;开明的;慷…...
通过实例讲解螺旋模型
目录 一、螺旋模型的核心概念 二、螺旋模型在电子商城系统开发中的应用示例 第 1 次螺旋:项目启动与风险初探...
(面试)Android各版本新特性
Android 6.0 (Marshmallow, API 23) 运行时权限管理:用户可在应用运行时动态授予或拒绝权限,取代安装时统一授权4。Doze模式与应用待机:优化后台耗电,延长设备续航5。指纹识别支持:原生API支持指纹身份验证。 Android…...
如何有效的开展接口自动化测试?
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中,通过对接口的自动化测试来提高测…...
当 PyIceberg 和 DuckDB 遇见 AWS S3 Tables:打造 Serverless 数据湖“开源梦幻组合”
引言 在一些大数据分析场景比如电商大数据营销中,我们需要快速分析存储海量用户行为数据(如浏览、加购、下单),以进行用户行为分析,优化营销策略。传统方法依赖 Spark/Presto 集群或 Redshift 查询 S3 上的 Parquet/O…...
泰迪杯特等奖案例深度解析:基于MSER-CNN的商品图片字符检测与识别系统设计
(第四届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 行业痛点与场景需求 在电商平台中,商品图片常包含促销文字(如“3折起”“限时秒杀”),但部分商家采用隐蔽文字误导消费者(如“起”字极小或位于边角)。传统人工审核效率低(日均处理量…...
开发工具指南
后端运维场用工具 工具文档简介1panel安装指南运维管理面板网盘功能介绍网盘jenkins可以通过1panel 进行安装jpom辅助安装文档后端项目发布工具...
将 Element UI 表格元素导出为 Excel 文件(处理了多级表头和固定列导出的问题)
import { saveAs } from file-saver import XLSX from xlsx /*** 将 Element UI 表格元素导出为 Excel 文件* param {HTMLElement} el - 要导出的 Element UI 表格的 DOM 元素* param {string} filename - 导出的 Excel 文件的文件名(不包含扩展名)*/ ex…...
图像对比度调整(局域拉普拉斯滤波)
一、背景介绍 之前刷对比度相关调整算法,找到效果不错,使用局域拉普拉斯做图像对比度调整,尝试复现和整理了下相关代码。 二、实现流程 1、基本原理 对输入图像进行高斯金字塔拆分,对每层的每个像素都针对性处理,生产…...
【控制波形如何COPY并无痛使用】
控制波形如何COPY并无痛使用 波形分析思路概况记录波形 波形分析 通过逻辑分析仪可以解析到设备的控制波形,在一些对于电机控制类的设备上显得尤为重要。通过分析不同波形,将PWM的波形存储到程序中得以实现,并建立合理的数据结构。 思路概…...
CSDN-2024《AGP-Net: Adaptive Graph Prior Network for Image Denoising》
推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统…...
使用IDEA开发Spark Maven应用程序【超详细教程】
一、创建项目 创建maven项目 二、修改pom.xml文件 创建好项目后,在pom.xml中改为: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w…...
深入探索MCP通信:构建高效的MCP Client
在现代软件开发中,高效的通信机制是构建复杂系统的关键。MCP(Model-Controller-Proxy)架构作为一种新兴的开发模式,提供了强大的工具来实现客户端与服务器之间的高效通信。本文将通过实际代码示例,详细探讨如何使用MCP…...
【第76例】IPD流程实战:华为业务流程架构BPA进化的4个阶段
目录 简介 第一个阶段,业务流程架构BPA1.0 第二个阶段,业务流程架构BPA2.0 BPA3.0、4.0 作者简介 简介 不管业务是复杂还是简单,企业内外的所有事情、所有业务都最终会归于流程。 甚至是大家经常说的所谓的各种方法论,具体的落脚点还是在流程上。 比如把大象放进冰…...
25-05-16计算机网络学习笔记Day1
深入剖析计算机网络:今日学习笔记总结 本系列博客源自作者在大二期末复习计算机网络时所记录笔记,看的视频资料是B站湖科大教书匠的计算机网络微课堂,每篇博客结尾附书写笔记(字丑见谅哈哈) 视频链接地址 一、计算机网络基础概念 …...
车道线检测----CLRNet
继续更新本系列,本文CLRNet,文章主要目的是弄懂论文关键部分,希望对文章细节有一个深刻的理解,有帮助的话,请收藏支持。 CLRNet:用于车道检测的跨层精炼网络 摘要 车道在智能车辆的视觉导航系统中至关重要…...
maven和npm区别是什么
这是一个很容易搞糊涂新手的问题,反正我刚开始从课堂的知识转向项目网站开发时,被这些问题弄得晕头转向,摸不着头脑,学的糊里糊涂,所以,写了这么久代码,也总结一下,为后来者传授下经…...
【SpringBoot】从零开始全面解析SpringMVC (二)
本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. 🐎文章专栏: JavaEE进阶 🚀若有问题 评论区见 👉gitee链接: 薯条不要番茄酱 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条…...
Python连接redis
第一步安装redis Releases microsoftarchive/redis 安装时勾上所有能勾上的选项下一步即可 在CMD中pip install redis 安装redis pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple 配置redis 在redis安装目录下找到 修改 line 57 bind 0.0.0.0 line…...
Unity3D Overdraw性能优化详解
前端 在 Unity3D 开发中,Overdraw(过度绘制) 是一个常见的性能问题,尤其在移动端设备上可能导致严重的帧率下降。以下是关于 Overdraw 的详细解析和优化方法: 对惹,这里有一个游戏开发交流小组࿰…...
uni-app 中适配 App 平台
文章目录 前言✅ 1. App 使用的 Runtime 架构:**WebView 原生容器(plus runtime)**📌 技术栈核心: ✅ 2. WebView Native 的通信机制详解(JSBridge)📤 Web → Native 调用…...
[CSS3]属性增强1
字体图标 使用字体图标可以实现简洁的图标效果, 字体图标展示的是图标, 本质是字体, 适合简单, 颜色单一的图标 优势 灵活性: 灵活的修改样式, 比如尺寸, 颜色等轻量级: 体积小, 渲染快, 降低服务器请求次数兼容性: 几乎兼容所有主流浏览器使用方便: 下载字体包使用字体图标…...
【Python+flask+mysql】网易云数据可视化分析(全网首发)
网易云数据可视化分析 项目概述 网易云数据可视化分析系统是一个基于Flask框架开发的Web应用,旨在对网易云音乐平台的用户、歌曲、专辑、歌单等数据进行全面的可视化分析。该系统通过直观的图表、表格和词云等形式,展示网易云音乐的数据分布特征&#…...
项目版本管理和Git分支管理方案
文章目录 一、团队协作1.项目团队与职责2.项目时间线与里程碑3.风险评估与应对措施4.跨团队同步会议(定期)跨团队同步会议(双周) 5.版本升级决策树6.边界明确与路标制定a.功能边界划分b.项目路标制定b1、项目路标制定核心要素b2. 路标表格模板…...
Java 21 + Spring Boot 3.5:AI驱动的高性能框架实战
简介 在微服务架构日益普及的今天,如何构建一个既高性能又具备AI驱动能力的后端系统成为开发者关注的焦点。本篇文章将深入探讨Java 21与Spring Boot 3.5的结合,展示如何通过Vector API和JIT优化实现单线程性能提升30%,并利用飞算JavaAI生成智能重试机制和超时控制代码,解…...
【MySQL】索引太多会怎样?
在 MySQL 中,虽然索引可以显著提高查询效率,但过多的索引(如超过 5-6 个)会带来以下弊端: 1. 存储空间占用增加 每个索引都需要额外的磁盘空间存储索引树(BTree)。对于大表来说,多个…...
Flask 是否使用类似 Spring Boot 的核心注解机制
Flask 和 Spring Boot 架构风格不同:Spring Boot 是“注解驱动的全家桶框架”,而 Flask 是“微核心 + 显式扩展的 Python 微框架”。因此: ❌ Flask 没有类似 Spring Boot 的“核心注解机制”(如 @SpringBootApplication),而是使用函数装饰器(decorator)作为核心语法特…...
学习threejs,使用Physijs物理引擎,各种constraint约束限制
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...
城市排水管网流量监测系统解决方案
一、方案背景 随着工业的不断发展和城市人口的急剧增加,工业废水和城市污水的排放量也大量增加。目前,我国已成为世界上污水排放量大、增加速度快的国家之一。然而,总体而言污水处理能力较低,有相当部分未经处理的污水直接或间接排…...
redis数据结构-11(了解 Redis 持久性选项:RDB 和 AOF)
了解 Redis 持久性选项:RDB 和 AOF Redis 提供了多个持久性选项,以确保数据持久性并防止在服务器发生故障或重启时丢失数据。了解这些选项对于为您的特定使用案例选择正确的策略、平衡性能和数据安全至关重要。本章节将深入探讨 Redis 中的两种主要持久…...
掌握 Kotlin Android 单元测试:MockK 框架深度实践指南
掌握 Kotlin Android 单元测试:MockK 框架深度实践指南 在 Android 开发中,单元测试是保障代码质量的核心手段。但面对复杂的依赖关系和 Kotlin 语言特性,传统 Mock 框架常显得力不从心。本文将带你深入 MockK —— 一款专为 Kotlin 设计的 …...