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

【Spring】Spring中的适配器模式

欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。

目录

  • 适配器模式
  • Spring MVC的适配器模式

适配器模式

![[2_Spring中的适配器模式.png]]

适配器模式(Adapter Pattern)是将一个类的接口转换成客户希望的另一种接口。从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
一般包含目标角色(Target)、源角色(Adaptee)、适配器角色(Adapter)。
通过继承或关联的方式,由适配器将源角色转换成目标角色。

Spring MVC的适配器模式

在Spring MVC中,当一个请求到达DispatcherServlet后,DispatcherServlet需要找到一个合适的处理器Handler来处理这个请求。
这个处理器可以有多种形式,如@Controller注解类中的方法:

@Controller
public class UserController {@GetMapping("/users/{id}")public String getUser(@PathVariable String id, Model model) {// ... 逻辑 ...return "userView";}
}

这里的 getUser 方法就是一个 Handler。
还有实现了HttpRequestHandler 接口的类:

public class MyHttpRequestHandler implements HttpRequestHandler {@Overridepublic void handleRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// ... 逻辑 ...response.getWriter().write("Hello from HttpRequestHandler!");}
}

DispatcherServlet希望以统一的方式调用各种类型的 Handler。
DispatcherServlet 本身并不直接知道如何调用 UserController 类的 getUser 方法,或者 MyHttpRequestHandler 类的 handleRequest 方法。这些 Handler 的调用方式、参数解析、返回值处理都千差万别。

这个时候,适配器登场了。Spring MVC定义了一个用户DispatcherServlet期望的目标角色HandlerAdapter接口,HandlerAdapter接口定义了一个DispatcherServlet可以统一调用的标准方法,handle()方法。
被适配的源角色就是上面提到的类型不同的Handler。

但是当我们去翻看源码时,我们发现了一件事情,Spring不止有一个适配器角色。如下:
![[2_Spring中的设计模式-2.png]]

![[2_Spring中的设计模式-1.png]]

这是因为Spring提供了多种HandlerAdapter的实现,每种实现负责适配一种或一类特定的Handler。
RequestMappingHandlerAdapter处理的适配对象为:被@RequestMapping、@GetMapping注解的控制器方法。
HttpRequestHandlerAdapter处理的适配对象为:实现了org.springframework.web.HttpRequestHandler 接口的类的实例。

Spring在适配器模式应用时做了适配职责的分离。
这样的设计和Java在设计类加载机制时相似,更灵活,易于扩展与维护。

![[【Spring】Spring中的适配器模式.png]]

http://www.dtcms.com/a/198193.html

相关文章:

  • 【PRB】深度解析GaN中最浅的受主缺陷
  • go语言协程调度器 GPM 模型
  • Vue-监听属性
  • 理想AI Talk第二季-重点信息总结
  • 【ROS2】RViz2源码分析(九):RosClientAbstraction和RosNodeAbstraction的关系
  • ngx_http_realip_module 模块概述
  • 【DeepSeek论文精读】11. 洞察 DeepSeek-V3:扩展挑战和对 AI 架构硬件的思考
  • c++多线程debug
  • 符合Python风格的对象(再谈向量类)
  • Spring Web MVC————入门(3)
  • Go语言--语法基础5--基本数据类型--类型转换
  • Vue 3 中使用 md-editor-v3 的完整实例markdown文本
  • 网络编程套接字(二)
  • 高并发内存池|二、Common
  • 【JavaWeb】JDBC
  • 如何利用内网穿透实现Cursor对私有化部署大模型的跨网络访问实践
  • java中sleep()和wait()暂停线程的区别
  • [Java实战]Spring Boot整合Elasticsearch(二十六)
  • 大模型微调步骤整理
  • 第9章 组件及事件处理
  • Mac 在恢复模式下出现 旋转地球图标 但进度非常缓慢
  • Oracle 内存优化
  • java中的Servlet3.x详解
  • sparkSQL读入csv文件写入mysql
  • 10.8 LangChain三大模块深度实战:从模型交互到企业级Agent工具链全解析
  • 多模态大语言模型arxiv论文略读(八十一)
  • SuperYOLO:多模态遥感图像中的超分辨率辅助目标检测之论文阅读
  • 贪心算法应用:最大匹配问题详解
  • 算法岗实习八股整理——深度学习篇(不断更新中)
  • 软件工程各种图总结