Spring 框架中用到的设计模式。常见设计模式总结以及其作用简要说明

Spring 框架中使用了许多设计模式,以下列举⼀些⽐较重要的:

重点 :单例、代理、⼯⼚、责任链

1、单例模式:

Spring 的 Bean 默认是单例模式,通过 Spring 容器管理 Bean 的⽣命周期,保证每个 Bean 只被创建⼀次,并在整个应⽤程序中重⽤。

2、⼯⼚模式:

Spring 使⽤⼯⼚模式通过 BeanFactory ApplicationContext 创建并管理 Bean 对象。

3、代理模式:

Spring AOP 基于动态代理技术,使⽤代理模式实现切⾯编程,提供了对 AOP 编程的⽀持。

4、观察者模式:

Spring 中的事件机制基于观察者模式,通过ApplicationEventPublisher 发布事件,由ApplicationListener 监听事件,实现了对象间的松耦合。

5、模板⽅法模式:

Spring 中的 JdbcTemplate 使⽤了模板⽅法模式,将⼀些固定的流程封装在⽗类中,⼦类只需实现⼀些抽象⽅法即可。

6、策略模式:

Spring 中的 HandlerInterceptor 和 HandlerExecutionChain 使⽤了策略模式,允许开发者⾃定义处理器拦截器,按照⼀定顺序执⾏。

7、责任链模式:

Spring 中的过滤器和拦截器使⽤了责任链模式,多个过滤器和拦截器按照⼀定顺序执⾏,每个过滤器和拦截器可以拦截请求或者响应并做出相应的处理。

Spring 框架中充分利⽤了许多设计模式,可以良好的扩展性和灵活性,降低代码的耦合度,提⾼代码的可维护性

补课:一些常见的设计模式及其简要说明:

1. 单例模式 (Singleton Pattern)

作用: 确保一个类只有一个实例,并提供全局访问点。
示例: 常用于数据库连接、日志记录器等。

2. 工厂模式 (Factory Pattern)

作用: 封装对象的创建过程,客户端无需直接创建对象,而是通过工厂方法获取对象。
示例: 常用于创建不同类型的对象,如各种产品对象。

3. 抽象工厂模式 (Abstract Factory Pattern)

作用: 提供一个接口,用于创建一组相关或依赖的对象,而不需要指定具体的类。
示例: 用于创建不同操作系统的界面组件。

4. 建造者模式 (Builder Pattern)

作用: 将一个复杂对象的构建过程分解为多个简单步骤,使得客户端可以灵活地构建对象。
示例: 常用于创建具有多个配置选项的对象。

5. 原型模式 (Prototype Pattern)

作用: 通过复制现有对象来创建新对象,避免了直接实例化。
示例: 常用于创建相似但有些差异的对象。

6. 适配器模式 (Adapter Pattern)

作用: 将一个接口转换成另一个客户端期望的接口,使不兼容的类可以一起工作。
示例: 用于兼容不同版本或接口的类。

7. 装饰器模式 (Decorator Pattern)

作用: 动态地给对象添加新功能,而不需要修改其原始代码。
示例: 用于扩展对象的行为,如添加日志记录、加密等功能。

8. 观察者模式 (Observer Pattern)

作用: 定义一种一对多的依赖关系,当一个对象状态发生改变时,其所有依赖对象都会得到通知并自动更新。
示例: 用于实现事件处理、消息通知等。

9. 策略模式 (Strategy Pattern)

作用: 定义一系列算法,将其封装成独立的策略类,使得算法可以相互替换,客户端可以灵活选择使用的策略。
示例: 用于实现不同的排序算法、计算方式等。

10. 责任链模式 (Chain of Responsibility Pattern)

作用: 将请求传递给一系列处理者,每个处理者决定是否处理请求,从而形成一个处理链。
示例: 用于处理请求的逻辑链,如权限验证、日志记录等。

11. 模板方法模式 (Template Method Pattern)

作用: 定义一个算法的骨架,将具体步骤延迟到子类中实现,以便子类可以改变算法的某些步骤而不改变其结构。
示例: 用于定义通用的算法流程,如图形界面组件的生命周期。

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

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

相关文章

JMeter压测工具介绍、安装及汉化教程,详解安装目录结构

🧑‍💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

新一代最强开源UI自动化测试神器Playwright(Java版)(对话框处理)

🎭Playwright让网页对话框🌐💬处理变得更加快捷!网页对话框是在网页上出现的常见弹窗,包括Alert、Confirm和Prompt等。这些对话框通常需要用户输入信息或进行某些选择,但是在自动化测试中处理它们可能会很棘…

KVM嵌套虚拟化实现

KVM嵌套虚拟化实现 理论 Libvirt主要支持三种 CPU mode host-passthrough: libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的。但是在热迁移时,它要求目的节点的 CPU 和源节点的…

jquery修改伪类元素的样式

$(.ant-input-group-wrap).hover(function() {$(this).css(color,red) });

将修改后的代码从一个克隆的仓库推送到新的 GitHub 仓库(以ORBSLAM2_with_pointcloud_map仓库为例)

将修改后的代码从一个克隆的仓库推送到新的 GitHub 仓库 本文介绍了如何从一个已经克隆下来的 GitHub 仓库中,将修改后的代码推送到一个新创建的 GitHub 仓库。 前提条件 已经克隆了一个现有的 GitHub 仓库到本地。示例仓库为:https://github.com/gao…

片上网络(1)概述

前言 NoC:On-Chip Networks,片上网络。 由于多核乃至众核时代的到来,用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时,总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…

JS中BigInt的使用

JS中BigInt的使用 BigInt是一种内置对象,它提供了一种方法来表示大于2^53 - 1的整数,通俗来讲就是提供了一种可以表示任意大整数的方法,当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候,会出错。所以此时我们需要使用Big…

【Linux】网络协议:(序列化和反序列化)json 的安装和简单使用

文章目录 1. 下载 json2. 基本使用value 类型&#xff1a;万能类型Writer 类型&#xff1a;序列化Reader 类型&#xff1a;反序列化 3. 使用举例 1. 下载 json yum makecache fast yum -y install jsoncpp-devel2. 基本使用 头文件&#xff1a; #include <jsoncpp/json/j…

LeetCode(力扣)55. 跳跃游戏Python

LeetCode20. 有效的括号 题目链接代码 题目链接 https://leetcode.cn/problems/jump-game/ 代码 class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) < 1:return Truecover 0for i in range(len(nums)):if i < cover:cover max(cover, i …

免备案海外服务器有什么好处?

介绍一&#xff1a;了解海外服务器免备案的优点 免备案海外服务器是指在国外搭建网站服务器而不是在国内备案&#xff0c;这种模式可以带来一定的便利 。首先&#xff0c;海外服务器免备案可以使网站更加稳定&#xff0c;因为国外网络环境更加稳定&#xff0c;大多数国外服务 器…

Ubuntu 22.04 安装配置 flatpak

Ubuntu 22.04 安装配置 Flatpak 安装 Flatpak sudo apt install flatpakFlatpak 仓库配置 官方仓库 https://flathub.org/repo/flathub上交大镜像 https://mirror.sjtu.edu.cn/flathub flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatp…

CPU、内存、缓存、硬盘的定义和关系

CPU、内存、缓存、硬盘 文章目录 CPU、内存、缓存、硬盘1. CPU2. 内存3. 缓存4. 硬盘5. 数据交换过程 1. CPU CPU&#xff1a;CPU是中央处理器&#xff08;Central Processing Unit&#xff09;的缩写&#xff0c;中央处理器是一块超大规模的集成电路&#xff0c;是一台计算机…

torch.from_numpy()函数(pytorch版)

torch.from_numpy(ndarray) 的作用就是将生成的数组&#xff08;array&#xff09;转换为张量Tensor。 该方法等同于torch.Tensor(ndarray)。 举例说明&#xff1a; 单纯的torch.from_numpy(ndarray)方法。 import numpy import torchdata1 numpy.array([5, 6, 9]) print…

三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析

三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析 在处理三维模型3DTile格式的轻量化压缩时&#xff0c;如何在减少数据量的同时&#xff0c;保证或提升数据质量是一大挑战。以下为一些提升数据质量的方法分析&#xff1a; 改进几何简化算法&#xff1a;在进行几何简化…

【MySQL系列】- MYSQL锁机制

【MySQL系列】- MYSQL锁机制 文章目录 【MySQL系列】- MYSQL锁机制一、表级锁表加读锁表独占锁释放锁 二、行级锁间隙锁&#xff08;Gap Locks&#xff09;临键锁&#xff08;Next-key Locks&#xff09; 三、页级锁四、共享锁&#xff08;S锁&#xff09;五、排他锁&#xff0…

webman跨域相关问题

2023年9月13日14:14:05 webman版本1.5 php版本8.0 运行环境windows 测试项目&#xff1a;https://gitee.com/open-php/zx-webman-website webman在跨域的时候&#xff0c;会有点不同因为第一个区别就是是否关闭自动路由 //关闭自动路由 Route::disableDefaultRoute();如果不…

List知识总结

ArrayList: 1 ArrayList扩容底层用到的是&#xff1b;System.arraycopy. 2 扩容的长度计算&#xff1b;int newCapacity oldCapacity (oldCapacity >> 1);&#xff0c;旧容量 旧容量右移1位&#xff0c;这相当于扩容为原 来容量的(int)3/2. 3 ArrayList<String…

02-yaml资源文件

1、创建pod的基础文件 创建pod的yaml文件详解 --- apiVersion: extensions/v1beta1 #当前格式的版本 kind: Deployment #当前创建资源的类型&#xff0c; 当前类型是Deployment metadata: #当前资源的元数据name…

Unity解决:Unity SpriteRenderer屏幕自适应的多种模式

上代码&#xff1a; using UnityEngine;[RequireComponent(typeof(Camera))] public class SpriteAdapter : MonoBehaviour {[System.Serializable]public class SpriteInfo{public SpriteRenderer Value null;public EFillModel Model EFillModel.ShowAll;}public enum EFi…

Vue知识系列(5)每天10个小知识点

目录 系列文章目录Vue知识系列&#xff08;1&#xff09;每天10个小知识点Vue知识系列&#xff08;2&#xff09;每天10个小知识点Vue知识系列&#xff08;3&#xff09;每天10个小知识点Vue知识系列&#xff08;4&#xff09;每天10个小知识点 知识点41.vue常用基本指令有哪些…