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

一文讲解Spring中应用的设计模式

我们都知道Spring 框架中用了蛮多设计模式的:
在这里插入图片描述

工厂模式呢,就是用来创建对象的,把对象的创建和使用分开,这样代码更灵活。代理模式呢,是用一个代理对象来控制对真实对象的访问,可以在访问前后做一些处理。单例模式呢,保证一个类只有一个实例,比如数据库连接池就经常用单例模式。模板模式呢,定义一个算法的框架,把具体的实现延迟到子类去做。观察者模式呢,定义了对象之间的一对多依赖关系,当一个对象状态改变时,依赖它的对象会自动更新。适配器模式呢,刚刚说过啦,就是把一个类的接口转换成另一个接口。策略模式呢,定义了一系列算法,把它们一个个封装起来,并且使它们可以相互替换。

工厂模式就像一个汽车工厂,它负责生产汽车,不同的车间负责不同的生产环节,最后组装出一辆完整的汽车。代理模式呢,比如你想买房,但是你自己不太懂房产市场,这时候就可以找一个房产中介,房产中介就是你的代理,他帮你找房子、谈价格,你通过他来和卖家打交道。单例模式呢,就像你家里的户口本,一本户口本对应一个家庭,这个家庭就是唯一的,户口本就是这个家庭的单例。模板模式呢,比如你做蛋糕,有一个蛋糕模具,这个模具就是模板,你按照这个模具的形状把蛋糕糊倒进去,烤出来的蛋糕就是固定的形状,但是你可以用不同的材料来做蛋糕。观察者模式呢,比如你在一个班级群里,老师发布一个消息,所有的学生都会收到,老师就是被观察的对象,学生就是观察者。适配器模式呢,就像刚刚说的 Type C 转接口,它把不同接口的设备连接起来。策略模式呢,比如你出门旅游,有很多种出行方式可以选择,坐飞机、坐火车或者自驾游,每种出行方式就是一种策略,你可以根据自己的需求选择不同的策略

①、比如说工厂模式用于 BeanFactory 和 ApplicationContext,实现 Bean 的创建和管理。

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = context.getBean(MyBean.class);

②、比如说单例模式,这样可以保证 Bean 的唯一性,减少系统开销。

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService1 = context.getBean(MyService.class);
MyService myService2 = context.getBean(MyService.class);// This will print "true" because both references point to the same instance
System.out.println(myService1 == myService2);

③、比如说 AOP 使用了代理模式来实现横切关注点(如事务管理、日志记录、权限控制等)。

横切关注点呢,就是那些会影响到多个模块的功能,比如日志记录、事务管理、权限验证等等。这些功能呢,它不属于某个特定的业务模块,而是横跨在多个业务模块之上的。就好比你有多个不同的房间,每个房间都需要打扫卫生,打扫卫生就是一个横切关注点,它影响到了所有的房间。在 Spring AOP 中呢,就可以通过代理模式来实现对这些横切关注点的统一处理,把这些通用的功能从具体的业务代码中分离出来,这样代码结构会更清晰,也更容易维护

@Transactional
public void myTransactionalMethod() {// 方法实现
}

这里,我们拿一个设计模式举例问问,Spring是如何实现单例模式的呢?

  • Spring 通过 IOC 容器实现单例模式,具体步骤是:
    单例 Bean 在容器初始化时创建并使用 DefaultSingletonBeanRegistry 提供的 singletonObjects 进行缓存。

在 Spring 中实现单例模式呢,主要是通过 Bean 工厂来管理 Bean 的实例。当你在配置文件中定义一个 Bean 的时候,Spring 容器会根据你的配置来创建 Bean 的实例。如果你把 Bean 的作用域设置为单例,那么 Spring 容器就只会创建一个 Bean 的实例,并且在整个容器的生命周期中都使用这个实例。默认情况下,Bean 的作用域就是单例的。另外呢,Spring 也支持通过编程的方式来实现单例模式,比如通过实现 Initializing Bean 接口或者 FactoryBean 接口来创建单例的 Bean。不过呢,一般情况下使用配置文件就可以方便地实现单例模式了。

// 单例缓存
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>();public Object getSingleton(String beanName) {return this.singletonObjects.get(beanName);
}protected void addSingleton(String beanName, Object singletonObject) {this.singletonObjects.put(beanName, singletonObject);
}
  • 在请求 Bean 时,Spring 会先从缓存中获取。

相关文章:

一文讲解Spring中应用的设计模式

我们都知道Spring 框架中用了蛮多设计模式的&#xff1a; 工厂模式呢&#xff0c;就是用来创建对象的&#xff0c;把对象的创建和使用分开&#xff0c;这样代码更灵活。代理模式呢&#xff0c;是用一个代理对象来控制对真实对象的访问&#xff0c;可以在访问前后做一些处理。单…...

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...

优选算法的灵动之章:双指针专题(一)

个人主页&#xff1a;手握风云 专栏&#xff1a;算法 目录 一、双指针算法思想 二、算法题精讲 2.1. 查找总价格为目标值的两个商品 2.2. 盛最多水的容器 ​编辑 2.3. 移动零 2.4. 有效的三角形个数 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构…...

PyQt4学习笔记1】使用QWidget创建窗口

目录 一、创建一个简单的 QWidget 窗口 二、设置窗口属性 1. 设置窗口标题 2. 设置背景颜色 3. 设置窗口大小和位置 4. 设置窗口模式 5. 关闭窗口 6. QWidget 及其子控件的样式 三、添加控件到 QWidget 1. 添加按钮 2. 添加标签 3. 添加文本框 4. 控件布局管理 四、自定义样式 …...

pycharm 中的 Mark Directory As 的作用是什么?

文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网&#xff1a;https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…...

【C++】string类(上):string类的常用接口介绍

文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…...

CSS关系选择器详解

CSS关系选择器详解 学习前提什么是关系选择器&#xff1f;后代选择器&#xff08;Descendant Combinator&#xff09;语法示例注意事项 子代选择器&#xff08;Child Combinator&#xff09;语法示例注意事项 邻接兄弟选择器&#xff08;Adjacent Sibling Combinator&#xff0…...

C语言中的信号量

信号是操作系统中用来传递特定消息的机制。操作系统可以使用这种方式将程序运行过程中发生的各类特殊情况发送给程序&#xff0c;并按照其指定的逻辑进行处理。信号名称都以 “SIG” 作为前缀&#xff0c;如程序访问非法内存时&#xff0c;会产生名为 SIGSEGV 的信号。 程序需…...

求一个数的数根(高精度)

上一期我们讲的是求一个数的数根&#xff0c;和本期唯一不同的是&#xff0c;数据范围不同了&#xff0c;上一期这个数是小于等于10的18次方的&#xff0c;这一期是小于等于10的1000次方的&#xff0c;开一个变量&#xff1f;肯定不行&#xff0c;我们需要再开一个数组&#xf…...

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;进程替换&#xff08;Process Substitution&#xff09;是一个非常强大的特性&#xff0c;它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…...

3 卷积神经网络CNN

1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron&#xff0c;可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…...

详解Linux系统的终端(Terminal)以及分类(各种tty开头的设备文件)

目录 终端(Terminal)的概念和作用终端(Terminal)在Linux中被视为设备,每个终端有自己的设备文件tty三个字母的来源(tty名字的来源)如何查看当前终端的设备文件常见终端的分类1-串口终端02-虚拟控制台终端&#xff08;Virtual Console&#xff09;03-伪终端&#xff08;Pseudo T…...

强化学习数学原理(五)——随机近似与随机

一、Motivating example 首先有个random variable(随机变量)X&#xff0c;我们的目标就是求出他的expectation E(x)&#xff0c;我们有一些iid的采样&#xff0c;xi&#xff0c;从1到n&#xff0c;求出均值 但是如果有很多数据&#xff0c;我需要等很久&#xff0c;把所有数据都…...

图书管理系统 Axios 源码__获取图书列表

目录 核心功能 源码介绍 1. 获取图书列表 技术要点 适用人群 本项目是一个基于 HTML Bootstrap JavaScript Axios 开发的图书管理系统&#xff0c;可用于 添加、编辑、删除和管理图书信息&#xff0c;适合前端开发者学习 前端交互设计、Axios 数据请求 以及 Bootstrap 样…...

线性数据结构:单向链表

放弃眼高手低&#xff0c;你真正投入学习&#xff0c;会因为找到一个新方法产生成就感&#xff0c;学习不仅是片面的记单词、学高数......只要是提升自己的过程&#xff0c;探索到了未知&#xff0c;就是学习。 考虑到可能有小白在合并代码时出现各种细节问题&#xff0c;本文…...

线程互斥同步

前言&#xff1a; 简单回顾一下上文所学&#xff0c;上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么&#xff0c;总结一句话&#xff0c;就是tid是用户视角下所认为的概念&#xff0c;因为在Linux系统中&#xff0c;从来没有线程这一说法&#xff0c;…...

《苍穹外卖》项目学习记录-Day11订单统计

根据起始时间和结束时间&#xff0c;先把begin放入集合中用while循环当begin不等于end的时候&#xff0c;让begin加一天&#xff0c;这样就把这个区间内的时间放到List集合。 查询每天的订单总数也就是查询的时间段是大于当天的开始时间&#xff08;0点0分0秒&#xff09;小于…...

SAP HCM 回溯分析

最近总有人问回溯问题&#xff0c;今天把12年总结的笔记在这共享下&#xff1a; 12年开这个图的时候总是不明白是什么原理&#xff0c;教程看N次&#xff0c;网上资料找一大堆&#xff0c;就是不明白原理&#xff0c;后来为搞明白逻辑&#xff0c;按照教材的数据一样做&#xf…...

JavaScript原型链与继承:优化与扩展的深度探索

在 JavaScript 的世界里&#xff0c;万物皆对象&#xff0c;而每个对象都有一个与之关联的原型对象&#xff0c;这就构成了原型链的基础。原型链&#xff0c;简单来说&#xff0c;是一个由对象的原型相互连接形成的链式结构 。每个对象都有一个内部属性[[Prototype]]&#xff0…...

五子棋对弈

问题描述 "在五子棋的对弈中&#xff0c;友谊的小船说翻就翻&#xff1f;" 不&#xff01;对小蓝和小桥来说&#xff0c;五子棋不仅是棋盘上的较量&#xff0c;更是心与心之间的沟通。这两位挚友秉承着"友谊第一&#xff0c;比赛第二"的宗旨&#xff0c;决…...

vue vscode插件推荐安装

在 VSCode 中开发 Vue&#xff0c;推荐安装以下插件&#xff1a; 核心插件 1. Volar&#xff08;Vue Language Features&#xff09; - Vue 3 官方推荐的开发工具&#xff0c;替代 Vetur。 This extension is deprecated. Use the Vue - Official extension instead. 1.Vue …...

Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法

Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…...

P7497 四方喝彩 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作&#xff0c;分四种&#xff1a; add ⁡ ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v)&#xff1a;对于所有 i ∈ [ l , r ] i \in [l,r…...

EtherCAT主站IGH-- 29 -- IGH之mailbox.h/c文件解析

EtherCAT主站IGH-- 29 -- IGH之mailbox.h/c文件解析 0 预览一 该文件功能`mailbox.c` 文件功能函数预览二 函数功能介绍`mailbox.c` 中主要函数的作用1. `ec_slave_mbox_prepare_send`2. `ec_slave_mbox_prepare_check`3. `ec_slave_mbox_check`4. `ec_slave_mbox_prepare_fetc…...

UI线程用到COM只能选单线程模型

无论用不用UI库&#xff0c;哪怕是用Win32 API手搓UI&#xff0c;UI线程要用COM的话&#xff0c;必须初始化为单线程单元(STA)&#xff0c;即CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);&#xff0c;不能用MULTITHREADTHREADED。 实际上&#xff0c;很多(WPF等)UI库若…...

排序算法--桶排序

核心思想为分区间排序后合并。适用于数据均匀分布在一个范围内&#xff0c;或浮点数排序或范围明确的数据。如果需要处理整数或其他数据范围&#xff0c;可以通过调整BUCKET_RANGE的计算方式实现&#xff0c;例如对[0,100)的整数排序&#xff1a; int index arr[i] / 10; // …...

zsh安装插件

0 zsh不仅在外观上比较美观&#xff0c;而且其具有强大的插件&#xff0c;如果不使用那就亏大了。 官方插件库 https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins 官方插件库并不一定有所有的插件&#xff0c;比如zsh-autosuggestions插件就不再列表里&#xff0c;下面演示zs…...

bypass hcaptcha、hcaptcha逆向

可以过steam&#xff0c;已支持并发&#xff0c;欢迎询问&#xff01; 有事危&#xff0c;ProfessorLuoMing...

python-UnitTest框架笔记

UnitTest框架的基本使用方法 UnitTest框架介绍 框架&#xff1a;framework&#xff0c;为了解决一类事情的功能集合 UnitTest框架&#xff1a;是python自带的单元测试框架 自带的&#xff0c;可以直接使用&#xff0c;不需要格外安装 测试人员用来做自动化测试&#xff0c;作…...

掌握API和控制点(从Java到JNI接口)_35 JNI开发与NDK 03

3、 如何载入 .so档案 VM的角色 由于Android的应用层级类别都是以Java撰写的&#xff0c;这些Java类别转译为Dex型式的Bytecode之后&#xff0c;必须仰赖Dalvik虚拟机器(VM: Virtual Machine)来执行之。 VM在Android平台里&#xff0c;扮演很重要的角色。此外&#xff0c;在执…...