一文讲解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 框架中用了蛮多设计模式的: 工厂模式呢,就是用来创建对象的,把对象的创建和使用分开,这样代码更灵活。代理模式呢,是用一个代理对象来控制对真实对象的访问,可以在访问前后做一些处理。单…...
Linux的基本指令(下)
1.find指令 Linux下find命令在⽬录结构中搜索⽂件,并执⾏指定的操作。 Linux下find命令提供了相当多的查找条件,功能很强⼤。由于find具有强⼤的功能,所以它的选项也很多,其中⼤部分选项都值得我们花时间来了解⼀下。 即使系统中含…...
HAO的Graham学习笔记
前置知识:凸包 摘录oiwiki 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为:对于给定集合 X,所有包含 X 的凸集的交集 S 被称为 X 的 凸包。 说人话就是用一个橡皮筋包含住所有给定点的形态 如图: 正题:…...
Elasticsearch Queries
Elasticsearch Compound Queries Elasticsearch 的 Compound Queries 是一种强大的工具,用于组合多个查询子句,以实现更复杂的搜索逻辑。这些查询子句可以是叶查询(Leaf Queries)或复合查询(Compound Queries…...
利用matlab寻找矩阵中最大值及其位置
目录 一、问题描述1.1 max函数用法1.2 MATLAB中 : : :的作用1.3 ind2sub函数用法 二、实现方法2.1 方法一:max和find2.2 方法二:max和ind2sub2.3 方法对比 三、参考文献 一、问题描述 matlab中求最大值可使用函数max,对于一维向量࿰…...
SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言
目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件: 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL(Data Definition Language):数据定义语言 1、操…...
【智力测试——二分、前缀和、乘法逆元、组合计数】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …...
Spring Security(maven项目) 3.0.2.9版本 --- 改
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
并发编程中的常见问题
1 竞态条件 (Race Condition) 定义:竞态条件是指多个线程在访问共享资源时,由于执行顺序的不同导致结果不确定的情况。 示例: public class Counter {private int count = 0;public void increment() {count++;}public int getCount() {return count;} }在多线程环境下,…...
二维前缀和:高效求解矩阵区域和问题
在处理二维矩阵时,频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵,时间复杂度较高。当矩阵非常大且有大量的查询时,直接计算将变得低效。为了提高效率,我们可以通过 二维前缀和 技巧在常数时间内解决这个…...
鸢尾花书《编程不难》02---学习书本里面的三个案例
文章目录 1.引言2.第一个例子---模拟硬币的投掷结果3.第二个例子---混合两个一元高斯分布的随机数4.第三个例子---线性回归的作图5.关于书中的问题的解决方案 1.引言 今天的这个文章主要是阅读学习鸢尾花书系列的第一本《编程不难》,今天主要是记录下书里面的两个例…...
MySQL(高级特性篇) 13 章——事务基础知识
一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 (1)存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些,以及这些存储引擎是否支持事务能看出在MySQL中,只有InnoDB是支持事务的 &#x…...
CSS Display属性完全指南
CSS Display属性完全指南 引言核心概念常用display值详解1. block(块级元素)2. inline(行内元素)3. inline-block(行内块级元素)4. flex(弹性布局)5. grid(网格布局&…...
【机器学习篇】K-Means 算法详解:从理论到实践的全面解析
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)
IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)(JetBrains家的其他IDE应该也支持) 之前看到宇宙第一IDE VS Code好像默认代理了远程的端口,但是一直没找到IDEA的同类功能,这次终于发现了 以Intell…...
内核定时器3-用户空间定时器
用户空间定时器与内核定时器的关系 虽然用户空间定时器和内核定时器在实现上各自独立,但用户空间定时器通常依赖于内核定时器提供的基础设施。以下是具体关系: 依赖性 用户空间定时器的实现基于内核定时器。 例如,POSIX 定时器使用内核的 h…...
C++ 字面量深度解析:从基础到实战进阶
在 C 开发中,字面量(Literal)不仅是基础语法的一部分,更是提升代码可读性、安全性和性能的关键工具。本文将深入探讨 C 字面量的高级特性、最新标准支持(C11/14/17/20)以及实际开发中的应用技巧,…...
论文paper(更新...)
目录 是否rebuttal?rebuttal 技巧 是否rebuttal? 如果不rebuttal 肯定会拒稿,编辑也会给审稿人发信息,如下: Comment: Thanks for your efforts in reviewing this paper. The authors have neither submitted a rebu…...
变形金刚多元宇宙
1 涉及的公司 1.1 孩之宝HasBro 孩之宝与Takara签订协议后,孩之宝开始使用Takara的专利进行研发。 1.2 日本特佳丽Takara公司 特佳丽Takara Diaclone可变形恐龙的机器人玩具 Microman可变形汽车的机器人玩具 1.3 日本东映TOEI ANIMTION 1.4 美国漫威 为了推广玩具…...
HTTP协议的无状态和无连接
无连接 ①无连接的含义 这里所说的无连接并不是指不连接,客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考…...
从工具到生态:2026年建站系统深度解析与选型指南
在数字化转型已成为企业标配的今天,建立一个专业的官方网站,早已不是“有没有”的问题,而是“好不好用、能否支撑业务”的深层次考量。对于许多企业管理者、运营人员或创业者来说,“建站系统”这个词或许并不陌生,但当…...
STM32 HAL库里Systick中断优先级设成0x0F,你的定时器还准吗?
STM32 HAL库中Systick中断优先级设置对定时精度的影响与优化实践 在嵌入式开发领域,定时精度往往直接影响着系统性能与稳定性。许多开发者在使用STM32 HAL库时,可能从未深入思考过Systick中断优先级设置对系统定时精度的影响。本文将揭示一个容易被忽视但…...
3个超简单步骤:零门槛制作专业级AI视频
3个超简单步骤:零门槛制作专业级AI视频 【免费下载链接】Open-Sora Open-Sora:为所有人实现高效视频制作 项目地址: https://gitcode.com/GitHub_Trending/op/Open-Sora 在数字内容创作领域,AI视频生成技术正以前所未有的速度改变着创…...
欲望与自感:表征关系分析
欲望与自感:表征关系分析---一、问题意识:为何分析欲望与自感的关系?在AI元人文的建构过程中,“自感”作为意义行为的源初感发,已经与多个哲学概念进行了划界——自感不是冲动、不是主体性、不是概念、不是生命、不是存…...
C++的std--ranges适配器视图元素类型推导规则与用户自定义类型
C20引入的std::ranges库彻底改变了序列操作的范式,其中适配器视图通过惰性求值和管道操作符实现了高效的函数式编程。当开发者尝试将用户自定义类型融入这套体系时,元素类型推导的复杂规则往往成为技术深水区。本文将揭示适配器视图背后的类型魔法&#…...
2026年重庆桶装水工厂,这些经营要点与避坑指南你知道吗?
2026 年,在重庆经营桶装水工厂,面临不少挑战和机遇。重庆水木华桶装水厂家有多年相关经验,能帮你少走弯路。下面就为你分享经营要点和避坑指南。常见经营痛点很多桶装水工厂老板都有过这样的经历。水质把控不好,容易出现异味、浑浊…...
DeepSeek-V3量化神优化:w4a8精度反超官方2.29%
DeepSeek-V3量化神优化:w4a8精度反超官方2.29% 【免费下载链接】DeepSeek-V3-0324-w4a8-mtp-QuaRot-per-channel 项目地址: https://ai.gitcode.com/Eco-Tech/DeepSeek-V3-0324-w4a8-mtp-QuaRot-per-channel 导语:国内大模型量化技术再获突破&am…...
Qwen3-TTS开源镜像实操:与LangChain集成构建多语种AI Agent语音接口
Qwen3-TTS开源镜像实操:与LangChain集成构建多语种AI Agent语音接口 1. 项目概述与核心价值 Qwen3-TTS-12Hz-1.7B-VoiceDesign是一个强大的多语言文本转语音模型,专为现代AI应用场景设计。这个模型最大的特点是能够处理10种主要语言,包括中…...
BepInEx跨平台部署完全指南:从环境配置到性能优化
BepInEx跨平台部署完全指南:从环境配置到性能优化 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 部署挑战自测表 在开始部署前,请先回答以下问题…...
Android与SpringBoot的轻量级数据桥梁——OkHttp3实战解析
1. OkHttp3与SpringBoot的黄金组合 第一次用OkHttp3对接SpringBoot后端时,我盯着满屏的404错误差点崩溃。后来才发现,原来是因为手机和电脑不在同一个WiFi下。这种看似低级的错误,恰恰是新手最容易踩的坑。OkHttp3作为Android端最流行的网络请…...
