Spring 中有哪些设计模式?

🧠 一、Spring 中常见的设计模式

设计模式类型Spring 中的应用场景
单例模式创建型默认 Bean 是单例的
工厂模式创建型BeanFactoryFactoryBean
抽象工厂模式创建型ApplicationContext 提供多个工厂接口
代理模式结构型AOP 动态代理(JDK/CGLIB)
模板方法模式行为型JdbcTemplateTransactionTemplate
观察者模式行为型ApplicationEventPublisher、事件监听
策略模式行为型Bean 的多实现组合(如多种验证器)
适配器模式结构型HandlerAdapterViewResolver
装饰器模式结构型BeanPostProcessor、Filter 链式处理
责任链模式行为型Spring MVC 的拦截器链、Filter 链
原型模式创建型@Scope("prototype") Bean 每次创建新实例
建造者模式创建型BeanDefinitionBuilder 构建 Bean 配置
组合模式结构型BeanFactory 管理多个 Bean、容器组合结构

🚀 二、常见设计模式详解举例

1️⃣ 单例模式:默认 Bean 模式

@Component
public class UserService {}

Spring 默认所有 Bean 都是单例,容器只创建一次,整个项目中共用同一实例。

2️⃣ 工厂模式 & 抽象工厂模式

  • BeanFactory 是顶层工厂
  • ApplicationContext 是功能更强大的“抽象工厂”
  • FactoryBean 是 Spring 中的一种特殊 Bean
@Component
public class MyFactoryBean implements FactoryBean<MyBean> {public MyBean getObject() {return new MyBean(); // 自定义创建逻辑}
}

3️⃣ 代理模式:AOP 的核心

使用 JDK 动态代理或 CGLIB 生成目标类的代理对象,增强原方法逻辑。

@Around("execution(* com.example..*Service.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("方法执行前");Object result = joinPoint.proceed();System.out.println("方法执行后");return result;
}

4️⃣ 模板方法模式:JdbcTemplate 就是经典代表

jdbcTemplate.query("SELECT * FROM users", rs -> {// 回调方法就是自定义部分
});

固定的执行流程(打开连接 → 执行 → 关闭),回调中只关注“变化点”。

5️⃣ 观察者模式:Spring 事件机制

applicationContext.publishEvent(new MyCustomEvent(...));

所有 ApplicationListener 都会接收到事件回调,实现异步解耦。

6️⃣ 责任链模式:拦截器链、Filter 链

Spring MVC 中的 HandlerInterceptor 实现链式执行:

preHandle()ControllerpostHandle()afterCompletion()

📦 三、为什么 Spring 用这么多设计模式?

  1. 解耦:控制反转、代理、事件等机制让组件之间低耦合
  2. 复用性强:模板方法、策略等让开发者只写差异部分
  3. 扩展性好:BeanPostProcessor、HandlerMapping 都可拓展
  4. 代码清晰:职责分明、结构层次清楚

✅ 总结一句话:

Spring 是一个把面向对象设计模式发挥到极致的框架。掌握设计模式,等于读懂 Spring 背后的智慧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# Winform 入门(3)之尺寸同比例缩放

放大前 放大后 1.定义当前窗体的宽度和高度 private float x;//定义当前窗体的宽度private float y;//定义当前窗台的高度 2.接收当前窗体的尺寸大小 x this.Width;//存储原始宽度ythis.Height;//存储原始高度setTag(this);//为控件设置 Tag 属性 3.声明方法&#xff0c;获…

从零开始的编程-java篇1.6.3

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

【Redis】数据的淘汰策略

目录 淘汰策略方案&#xff08;8种&#xff09; LRU和LFU策略的区别 使用建议 手搓LRU算法 方式一 方式二 大家好&#xff0c;我是jstart千语。今天和大家回来聊一下redis&#xff0c;这次要讲的是它的淘汰策略。为什么需要淘汰策略呢&#xff0c;就是当redis里面的内存占…

【前端】Node.js一本通

近两天更新完毕&#xff0c;建议关注收藏点赞。 目录 复习Node.js概述使用fs文件系统模块path路径模块 http模块 复习 为什么JS可以在浏览器中执行 原理&#xff1a;待执行的JS代码->JS解析引擎 不同的浏览器使用不同的 JavaScript 解析引擎&#xff1a;其中&#xff0c;C…

【AI论文】JavisDiT: 具备层次化时空先验同步机制的联合音视频扩散Transformer

摘要&#xff1a;本文介绍了一种新型的联合音频-视频扩散变换器JavisDiT&#xff0c;该变换器专为同步音频-视频生成&#xff08;JAVG&#xff09;而设计。 基于强大的扩散变换器&#xff08;DiT&#xff09;架构&#xff0c;JavisDiT能够根据开放式用户提示同时生成高质量的音…

Java-实现公有字段自动注入(创建人、创建时间、修改人、修改时间)

文章目录 Mybatis-plus实现自动注入定义 MetaObjectHandler配置 MyBatis-Plus 使用 MetaObjectHandler实体类字段注解使用服务类进行操作测试 Jpa启用审计功能实现自动注入添加依赖启动类启用审计功能实现AuditorAware接口实体类中使用审计注解 总结 自动注入创建人、创建时间、…

金融机构开源软件风险管理体系建设

开源软件为金融行业带来了创新活力的同时&#xff0c;也引入了一系列独特的风险。金融机构需要构建系统化的风险管理体系&#xff0c;以识别和应对开源软件在全生命周期中的各种风险点。下面我们将解析开源软件在金融场景下的主要风险类别&#xff0c;并探讨如何建立健全的风险…

图形渲染中的定点数和浮点数

三种API的NDC区别 NDC全称&#xff0c;Normalized Device Coordinates Metal、Vulkan、OpenGL的区别如下&#xff1a; featureOpenGL NDCMetal NDCVulkan NDC坐标系右手左手右手z值范围[-1,1][0,1][0,1]xy视口范围[-1,1][-1,1][-1,1] GPU渲染的定点数和浮点数 定点数类型&a…

同花顺客户端公司财报抓取分析

目标客户端下载地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要难点在登陆,获取token中的 jgbsessid (每次重新登录这个字段都会立即失效,且有效期应该是15天的) 抓取jgbsessid 主要通过安装mitmproxy 使用 mitmdump + 下边的脚本实现监听接口…

QT工程建立

打开软件新建一个工程 选择chose 工程命名&#xff0c;选择保存路径&#xff0c;可以自己选择&#xff0c;但是不要有中文路径 默认的直接下一步 任意选一个下一步 点击完成 之后是这个界面&#xff0c;点击右下角的绿色三角形编译一下 实验内容 添加类 第一个是建立cpp和.h文件…

【NLP 53、投机采样加速推理】

目录 一、投机采样 二、投机采样改进&#xff1a;美杜莎模型 流程 改进 三、Deepseek的投机采样 流程 Ⅰ、输入文本预处理 Ⅱ、引导模型预测 Ⅲ、候选集筛选&#xff08;可选&#xff09; Ⅳ、主模型验证 Ⅴ、生成输出与循环 骗你的&#xff0c;其实我在意透了 —— 25.4.4 一、…

ffmpeg时间基与时间戳

时间基、时间戳 时间基&#xff1a;表示时间单位的分数&#xff0c;用来定义视频或音频流中时间的精度。其形式是一个分数&#xff0c;分子通常为 1&#xff0c;而分母则表示每秒的单位数。 时间戳&#xff1a;代表在时间轴里占了多少个格子&#xff0c;是特定的时间点。 时间…

激光加工中平面倾斜度的矫正

在激光加工中&#xff0c;加工平面的倾斜度矫正至关重要&#xff0c;直接影响加工精度和材料处理效果。以下是系统的矫正方法和步骤&#xff1a; 5. 验证与迭代 二次测量&#xff1a;加工后重新检测平面度&#xff0c;确认残余误差。 反馈优化&#xff1a;根据误差分布修正补偿…

算法刷题记录——LeetCode篇(2.2) [第111~120题](持续更新)

更新时间&#xff1a;2025-04-04 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 114. 二叉树展开为链表 给你二…

C语言学习笔记-9

九、结构体 构造类型&#xff1a; 不是基本类型的数据结构也不是指针类型&#xff0c; 它是若干个相同或不同类型的数据构成的集合 结构体类型&#xff1a; 结构体是一种构造类型的数据结构&#xff0c;是一种或多种基本类型或构造类型的数据的集合。 1.结构体类型定义 定…

Test——BUG篇

目录 一软件测试的生命周期 二BUG 1概念 2描述Bug 3Bug级别 4Bug的生命周期 三与开发人员发生争执怎么办 ​编辑1先自省&#xff1a;是否Bug描述不清晰 2站在用户角度考虑并抛出问题 3Bug定级有理有据 4不仅要提出问题&#xff0c;还要给出解决方案 5Bug评审 5.1…

【Block总结】HWAB,半小波注意力块|即插即用

论文信息 标题: HALF WAVELET ATTENTION ON M-NET+ FOR LOW-LIGHT IMAGE ENHANCEMENT 地址: arXiv:2203.01296 日期: 2022年3月 创新点 改进的分层架构 M-Net+: 提出了一个专为低光图像增强设计的改良分层模型 M-Net+。该架构旨在缓解采样过程中的空间信息损失问题。通过采用…

Spring 中的事务

&#x1f9fe; 一、什么是事务&#xff1f; &#x1f9e0; 通俗理解&#xff1a; 事务 一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;不能只做一半。 比如你转账&#xff1a; A 账户扣钱B 账户加钱 如果 A 扣了钱但 B 没收到&#xff0c;那就出问…

Flutter极速接入IM聊天功能并支持鸿蒙

Flutter极速接入IM聊天功能并支持鸿蒙 如果你们也是Flutter项目&#xff0c;想快速接入聊天&#xff0c;包括聊天的UI界面&#xff0c;强烈推荐这一家。因为我们已经完成了集成&#xff0c;使用非常稳定&#xff0c;集成也非常快捷方便。 而且&#xff0c;就在今天&#xff0c…

C# 类库生成后自动复制到指定目录

C# 类库生成后自动复制到指定目录 在C#中,当你开发了一个类库项目(通常是.NET Core或.NET Framework项目),你可能会希望在构建(Build)完成后自动将生成的DLL文件复制到指定的目录。有几种方法可以实现这个需求,下面是一些常用的方法: 方法1:使用MSBuild的AfterBuild…