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

Spring 常见设计模式

什么是设计模式?

        设计模式Design pattern)是为解决软件设计中通用问题而被提出的一套指导性思想。它是一种被反复验证、经过实践证明并被广泛应用的代码设计经验和思想总结,可以帮助开发者通过一定的模式来快速的开发高质量、可维护性强的软件。

Spring常见设计模式有哪些?

简单工厂模式(StaticFactory Method Pattern)

        简单工厂模式是Spring中BeanFactory的实现方式。它根据传入的唯一标识动态地决定创建哪一个产品类。例如,在Spring配置中,通过传入一个唯一的标识来获取对应的Bean对象。这种方式将对象的创建和使用相分离,提高了程序的灵活性和可扩展性。

工厂方法模式(Factory Method Pattern)

        工厂方法模式在Spring中主要体现在FactoryBean上。它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。这种方式使得对象的创建及初始化职责交给工厂对象,从而实现了对象的创建与使用的解耦。在Spring中,如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。

BeanFactory和FactoryBean的区别

  • BeanFactory:是Spring框架中最基础的工厂类,负责创建和管理Bean对象。它根据配置文件或注解来创建Bean实例。
  • FactoryBean:是Spring提供的一种特殊的Bean,它允许用户自定义Bean的创建过程。FactoryBean接口的实现类可以返回一个对象,也可以返回另一个Bean定义(即返回另一个Bean的ID)。这使得用户可以更加灵活地控制Bean的创建过程。

单例模式(Singleton Pattern)

        单例模式在Spring中用于保证一个类仅有一个实例,并提供一个访问它的全局访问点。Spring中的默认bean均为singleton,这意味着它们在整个应用程序中都是唯一的。通过singleton属性或scope属性可以指定bean的作用范围。

代理模式(Proxy Pattern)

        Spring中的代理模式主要利用动态代理机制,实现AOP(面向切面编程)‌。Spring框架通过动态代理模式,允许开发者在不修改现有代码的情况下,对方法调用进行拦截,并在方法调用前后添加额外的处理逻辑,从而实现横切关注点的模块化,如日志记录、事务管理、安全检查等。

模板方法模式(Template Method Pattern)

        Spring中的许多模板,如JdbcTemplate、RestTemplate、RabbitTemplate等,都使用了模板方法模式。这些模板抽象了一些常用的操作,允许用户通过回调函数自定义这些操作的特定部分,而常规的执行流程则被模板方法所管理。

观察者模式(Observer Pattern)

​        观察者模式‌是通过事件监听机制实现的,这是一种设计模式,其中多个对象之间存在一对多的依赖关系。当一个对象(主题)的状态发生改变时,所有依赖于它的对象(观察者)都会收到通知并被自动更新。这种模式有时也被称为发布-订阅模式或模型-视图模式,它属于对象行为型模式。 ​

策略模式(Strategy Pattern)

        策略模式‌是一种设计模式,它允许你在运行时根据需要动态地选择和使用不同的算法或策略。这种模式特别适用于那些需要在不同情况下采用不同处理逻辑的场景。在Spring框架中实现策略模式,可以通过定义策略接口、实现具体的策略类,并在运行时根据需要选择合适的策略类来执行。

策略模式的实现通常包括以下几个步骤: ‌

  • 定义策略接口‌:首先,需要定义一个策略接口,该接口声明了所有策略需要实现的方法。例如,如果你有一个计算折扣的业务场景,策略接口可能定义了一个calculateDiscount方法。 ‌
  • 实现具体的策略类‌:然后,为每个具体的策略实现一个类,这些类实现了策略接口并提供了具体的实现逻辑。例如,对于计算折扣的场景,可能会有一个FixedDiscountStrategy和一个PercentageDiscountStrategy等。 ‌
  • 在Spring中配置和使用策略‌:在Spring中,你可以通过注解(如@Service)来声明这些策略类为Spring Beans。然后,你可以使用Spring的依赖注入功能,在需要使用策略的地方注入相应的策略Bean。例如,你可以根据业务需求,通过配置决定使用哪种折扣策略。 ‌
  • 动态选择策略‌:在运行时,你可以根据业务逻辑动态地选择合适的策略进行执行。这可以通过条件判断、配置文件、或者通过更高级的方式如使用Spring Expression Language(SpEL)来实现。
  • 优点和缺点‌:策略模式的优点包括增加了策略的可替换性,使得策略可以独立于使用它的客户端变化。然而,如果有很多策略,管理这些策略可能会变得复杂。此外,每次都在循环中运行以选择合适的策略可能会导致执行时间变慢并增加处理开销‌。 ‌
  • Spring源码中的应用‌:Spring框架本身也广泛使用了策略模式。例如,在Spring的初始化过程中,不同类型的类采用不同的初始化策略,这些策略通过实现InstantiationStrategy接口来定义‌。

装饰器模式(Decorator Pattern)

        装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。‌ 装饰器模式是一种结构型设计模式,它允许你在运行时向对象动态地添加职责,而不需要修改其原有的代码。这种模式通过创建一个包装对象(即装饰器),来包含并增强原有对象的功能。与继承相比,装饰器模式提供了更大的灵活性,因为它不需要修改原始类,就可以扩展或修改对象的行为。

在Spring框架中,装饰器模式的应用体现在多个方面。例如,SpringMVC中的HandlerAdapter就是装饰器模式的一个应用实例。

HandlerAdapter根据特定的规则执行不同的Handler,这允许开发者在不修改原有Controller代码的情况下,通过增加新的Handler和对应的HandlerAdapter来扩展SpringMVC的功能。这种设计使得SpringMVC的扩展变得相对容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可‌。

此外,Spring中的包装器模式(Wrapper Pattern)在类名上也有两种表现:一种是类名中含有"Wrapper",另一种是类名中含有"Decorator"。尽管命名上有所差异,但实质上,它们都实现了动态地给一个对象添加一些额外的职责,这与装饰器模式的核心理念是一致的。Spring通过这种方式,提供了更大的灵活性,使得开发者能够根据需要动态地增强对象的功能‌。

适配器模式(Adapter Pattern)

        适配器模式的主要思想是通过创建一个适配器类,该类实现客户端期望的接口,同时持有需要适配的类的实例。这样,客户端就可以通过适配器类来访问适配类的功能,而无需关心适配类与客户端期望的接口是否匹配。

在Spring中,适配器模式的应用非常广泛,例如: ‌

  • ServletRequestDataBinder适配器类‌:在Spring MVC框架中,用户提交的表单数据需要进行类型转换、格式化等操作后才能进行进一步处理。ServletRequestDataBinder就是用来完成这个过程的适配器类,它扩展了WebDataBinder类,通过添加绑定值的方法来实现适配。 ‌
  • Spring AOP中的AdvisorAdapter类‌:Spring的AOP(面向切面编程)中,AdvisorAdapter类用于适配不同的Advice类型,如MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice等,通过具体的Adapter实现来处理不同类型的Advice请求。 ‌
  • MessageListenerAdapter‌:在Spring的消息处理中,MessageListenerAdapter作为适配器,允许用户设置一个消息监听器对象作为其委托,从而使得不同类型的消息监听器能够被统一处理。

组合模式(Composite Pattern)

        组合模式‌是一种结构型设计模式,它允许用户将对象组合成树形结构来表示部分-整体的层次结构。这种模式通过引入一个抽象的组件接口和具体的组件类来实现,其中抽象组件接口定义了访问和操作子组件的方法,而具体的组件类则实现这些方法。在Spring中,这种模式的应用主要体现在对缓存的管理上,例如通过实现AbstractCompositeCacheManager类来管理多个缓存对象,从而形成一个缓存管理的组合结构。

组合模式的关键角色包括: ‌

        Component‌:这是组合中的对象,它声明了一个接口用于访问和管理子部件。在适当的情况下,Component还实现了所有类共有的接口默认行为。 ‌

        Leaf‌:表示组合结构中的叶子节点对象,它没有子节点。

在Spring中,CompositeCacheManager类继承自AbstractCompositeCacheManager,实现了缓存的管理功能。这个类通过重写getCache(String name)方法,能够根据提供的缓存名称从所有管理器中获取缓存对象。如果找不到缓存对象,则会创建一个新的缓存对象并添加到组合中。这个过程体现了组合模式的核心理念:将对象组合成树形结构以表示部分-整体的层次结构关系。

依赖注入模式(Dependency Injection Pattern)

接口注入、构造函数注入、Setter方法注入

相关文章:

Spring 常见设计模式

什么是设计模式? 设计模式(Design pattern)是为解决软件设计中通用问题而被提出的一套指导性思想。它是一种被反复验证、经过实践证明并被广泛应用的代码设计经验和思想总结,可以帮助开发者通过一定的模式来快速的开发高质量、可维…...

优化大量数据导出到Excel的内存消耗(二):如果数据超出Excel单表上限,则进行分表

优化前:优化大量数据导出到Excel的内存消耗_大文件异步导出 内存占用高-CSDN博客 写Excel文件报错:Invalid row number (1048576) outside allowable range (0..1048575) 写入Excel时遇到IllegalArgumentException,原因是超出允许的最大行数…...

rustrover打开会报Error: Invalid toolchain

如果 cargo --version 正常输出,但在使用 RustRover 时出现“Invalid toolchain”错误,可能是由于 RustRover 工具链配置有问题或路径指向错误。 解决步骤: 1. 检查 RustRover 的工具链配置 打开 RustRover,进入 Preferences 或…...

docker-compose 安装canal

创建 Canal 配置文件 /conf/canal.properties mkdir -p conf/ touch /conf/canal.properties # canal.properties# tcp bind ip canal.ip 0.0.0.0 canal.port 11111 canal.metrics.pull.port 11112# zookeeper 集群配置 canal.zkServers canal.zookeeper.sessionTimeout…...

Unity动画模块 之 3D Rig页签

​本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ 1.Rig页签 Rig 选项卡 - Unity 手册,rig是设置骨骼与替身系统的,工作流程如下 Avatar是什么…...

【蓝桥杯冲刺省一,省一看这些就够了-Java版本】蓝桥杯日期问题相关模板以及练习题

蓝桥杯历年省赛真题 点击链接免费加入题单 日期问题 java.time Java 中用于处理日期和时间的主要类位于 java.time 包中。以下是一些常用的类和其功能的简要介绍: LocalDate:表示日期。它提供了获取年、月、日以及日期之间比较的方法。 LocalDate to…...

【经典算法】BFS_FloodFill算法

目录 1, 算法介绍2,算法原理和代码实现(含题目链接)733.图像渲染200.岛屿的数量695.岛屿的最大面积130.被围绕的区域 3, 算法总结 1, 算法介绍 FloodFill(洪水灌溉) 算法介绍: 假设一个 4 * 4 的方格代表一块土地&am…...

RocketMQ之Topic主题详解

Topic概念定义 主题:RocketMQ中消息传输和存储的顶层容器,用于标识同类业务中逻辑的消息,可理解为消息的分类,主题消息的分类取决于业务,要发送的业务消息最好单独是一个Topic主题,以保证互相不被干扰Topi…...

实战OpenCV之图像显示

基础入门 OpenCV提供的功能非常多,图像显示是最基础也是最直观的一部分。它让我们能够直观地看到算法处理后的效果,对于调试和验证都至关重要。在OpenCV中,图像显示主要依赖于以下四个关键的数据结构和函数。 1、Mat类。这是OpenCV中最基本的…...

I2C的10-bit地址空间

10-bit地址空间: I2C支持 10-bit的设备地址,此时的时序如下图所示: 在 10-bit地址的 I2C系统中,需要两个帧来传输 slave的地址。第一个帧的前 5个 bit固定为 b11110,后接 slave地址的高 2位,第 8位仍然是 …...

TinyWebserver的复现与改进(6):定时器处理非活动连接

如果客户端长时间没有动作,会占用了许多连接资源,严重影响服务器的性能。因此需要通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。 定时器处理流程 SIGALARM触发:整个流程开始于一个 SIGALARM 信号&…...

ThinkPHP5 5.0.23 远程代码执行漏洞

目录 1、启动环境 2、漏洞利用 3、更改传参方式 4、修改参数 5、发送数据 1、启动环境 docker-compose up -d 2、访问靶机ip端口号8080 2、漏洞利用 使用burpsuite抓包软件抓包 3、更改传参方式 将 GET传参改为POST传参 4、修改参数 url参数 /index.php?scaptcha post参…...

C++鼠标键盘操作自动化

C鼠标键盘操作自动化 #pragma once #include <Windows.h> enum KEYS{A 65,W87,S83,D68,SHIFTVK_LSHIFT,ALT18,Tilde 126,//~TABVK_TAB,B66,SPACEVK_SPACE,ESCVK_ESCAPE,Q81 }; enum MOUSE {ML,MW,MR//左&#xff0c;中&#xff0c;右 }; class simulator//模拟器 { pu…...

多个主流Python GUI库全面解析,助你用Python轻松构建精美界面

Python 作为一门易学易用的编程语言&#xff0c;在各个领域都拥有广泛的应用。而 GUI (Graphical User Interface) 编程更是让 Python 变得更加灵活&#xff0c;可以帮助我们创建各种各样的桌面应用&#xff0c;为用户提供直观的交互体验。本文将介绍几个Python GUI 编程中常用…...

Kotlin学习-01创建kotlin学习

安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行...

Java、python、php版的企业单位考勤打卡管理系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…...

在IntelliJ IDEA中使用Git推送项目

去gitee网站注册用户 gitee网站地址:https://gitee.com/ github网站地址:https://github.com/ 一、创建仓库 以下以gitee为例进行介绍&#xff0c;github操作雷同。 1、创建仓库 点击页面右上方的"“并选择"创建仓库” 2、设置仓库相关信息 首先输入仓库名&…...

CNN代码实战

CNN的原理 从 DNN 到 CNN &#xff08;1&#xff09;卷积层与汇聚 ⚫ 深度神经网络 DNN 中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这叫全连接&#xff1b;卷积神经网络 CNN 中&#xff0c;新增了卷积层&#xff08;Convolution&#xff09;与汇聚&#xff08…...

迁移学习代码复现

一、前言 说来可能令人难以置信,迁移学习技术在实践中是非常简单的,我们仅需要保留训练好的神经网络整体或者部分网络,再在使用迁移学习的情况下把保留的模型重新加载到内存中,就完成了迁移的过程。之后,我们就可以像训练普通神经网络那样训练迁移过来的神经网络了。 我们…...

Elasticsearch(ES)常用命令

常用运维命令 一、基本命令1.1、查看集群的健康状态1.2、查看节点信息1.3、查看索引列表1.4、创建索引1.5、删除索引1.6、关闭索引1.7、打开索引1.8、查看集群资源使用情况&#xff08;各个节点的状态&#xff0c;包括磁盘&#xff0c;heap&#xff0c;ram的使用情况&#xff0…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...