Spring 框架中都用到了哪些设计模式:单例模式、策略模式、代理模式

Spring 框架是一个功能强大的企业级应用开发框架,它使用了多种设计模式来提高代码的可维护性、可扩展性和可重用性。以下是 Spring 框架中常见的几个设计模式,并简要说明它们的应用场景:

1. 单例模式(Singleton Pattern)

定义:确保一个类只有一个实例,并提供全局访问点。

Spring 中的应用

  • Spring 默认情况下,Bean 是单例的。即,在 Spring 容器中,每个定义的 Bean 只有一个实例,所有对该 Bean 的请求都返回同一个实例。
  • 可以通过 @Scope("singleton") 注解来显式指定一个 Bean 为单例。

示例

 

java复制代码

@Component @Scope("singleton") public class SingletonBean { // 单例 Bean }

2. 策略模式(Strategy Pattern)

定义:定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。本模式使得算法可独立于使用它的客户而变化。

Spring 中的应用

  • Spring 中的 BeanFactory 和 ApplicationContext 实现了策略模式。在不同的情况下,可以使用不同的 Bean 创建策略。
  • 事务管理中,Spring 也使用策略模式来决定不同的事务管理器,比如 DataSourceTransactionManager 和 JtaTransactionManager
  • 通过 @Qualifier 注解,可以选择具体的实现策略。

示例

 

java复制代码

public interface PaymentStrategy { void pay(int amount); } @Component @Qualifier("creditCard") public class CreditCardPayment implements PaymentStrategy { public void pay(int amount) { // 信用卡支付逻辑 } } @Component @Qualifier("paypal") public class PayPalPayment implements PaymentStrategy { public void pay(int amount) { // PayPal支付逻辑 } } @Service public class PaymentService { private final PaymentStrategy paymentStrategy; @Autowired public PaymentService(@Qualifier("creditCard") PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void processPayment(int amount) { paymentStrategy.pay(amount); } }

3. 代理模式(Proxy Pattern)

定义:为其他对象提供一种代理以控制对这个对象的访问。

Spring 中的应用

  • Spring AOP(面向切面编程)使用了代理模式来实现方法的拦截和增强。可以通过 JDK 动态代理或 CGLIB 代理来创建代理对象。
  • 事务管理也是通过代理模式实现的。Spring 在事务方法之前和之后插入事务处理逻辑。

示例

 

java复制代码

@Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Executing method: " + joinPoint.getSignature().getName()); } } @Service public class SomeService { public void someMethod() { // 方法逻辑 } } // 配置类 @Configuration @EnableAspectJAutoProxy public class AppConfig { // 配置类内容 }

其他常见设计模式

除了上述三种设计模式,Spring 框架还使用了其他一些设计模式:

1. 工厂模式(Factory Pattern)

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。 Spring 中的应用:Spring 的 BeanFactoryApplicationContext 都实现了工厂模式,用于创建和管理 Bean 的实例。

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

定义:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 Spring 中的应用:Spring 的 JdbcTemplateRestTemplateJpaTemplate 等都使用了模板方法模式,简化了数据库和 RESTful 服务的操作。

3. 观察者模式(Observer Pattern)

定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 Spring 中的应用:Spring 的事件机制使用了观察者模式,例如 ApplicationEventApplicationListener

4. 装饰器模式(Decorator Pattern)

定义:动态地给一个对象添加一些额外的职责。就扩展功能来说,装饰模式比生成子类更为灵活。 Spring 中的应用:Spring 的 BeanWrapperBeanPostProcessorHandlerInterceptor 等都使用了装饰器模式。

总结

Spring 框架使用了多种设计模式来提高其灵活性和可扩展性,其中包括但不限于:

  1. 单例模式:用于默认的 Bean 作用域,实现单例。
  2. 策略模式:用于不同的 Bean 创建策略、事务管理策略等。
  3. 代理模式:用于 AOP、事务管理等,通过代理对象实现方法拦截和增强���
  4. 工厂模式:用于 BeanFactory 和 ApplicationContext 创建和管理 Bean 实例。
  5. 模板方法模式:用于 JdbcTemplateRestTemplate 等,简化常见操作。
  6. 观察者模式:用于 Spring 事件机制,实现事件发布和监听。
  7. 装饰器模式:用于 BeanWrapperBeanPostProcessor 等,实现功能的动态扩展。

理解这些设计模式在 Spring 中的应用有助于更好地掌握 Spring 框架的核心原理,提高开发效率和代码质量。

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

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

相关文章

SpringCloud_Eureka注册中心

概述 Eureka是SpringCloud的注册中心。 是一款基于REST的服务治理框架,用于实现微服务架构中的服务发现和负载均衡。 在Eureka体系中,有两种角色: 服务提供者和服务消费者。 服务提供者将自己注册到Eureka服务器,服务消费者从Eureka服务器中…

白骑士的Python教学实战项目篇 4.1 数据分析与可视化

系列目录 上一篇:白骑士的Python教学高级篇 3.4 Web开发​​​​​​​ 在本篇内容中,我们将介绍如何使用Python进行数据分析与可视化。数据分析与可视化是数据科学的重要组成部分,能够帮助我们从数据中提取有价值的信息和洞察。我们将使用P…

软件著作权申请:保障开发者权益,促进软件创新

一、引言 在数字化时代,软件作为信息技术的核心,已成为推动社会进步和经济发展的重要力量。然而,随着软件产业的蓬勃发展,软件侵权和抄袭现象也日益严重。为了保护软件开发者的合法权益,促进软件产业的健康发展&#…

MPP和Hadoop的架构与场景分析

1、架构: MPP: MPP (Massively Parallel Processing)大规模并行处理,最开始的设计目的是为了消除共享资源的使用。 MPP数据库是:采用非共享架构(Shared Nothing)架构的分布式并行结构化数据库集群&#xff…

PyTorch从零开始实现LSTM

文章目录 LSTM基础理论从零开始实现LSTM简洁版LSTM实现参考资料 LSTM基础理论 关于LSTM的基础理论不再赘述,可以参考资料: RNN神经网络-LSTM模型结构https://github.com/ShusenTang/Dive-into-DL-PyTorch/blob/master/docs/chapter06_RNN/6.8_lstm.md …

摄影后期色彩管理流程(Lightroom篇)

在摄影后期处理中,色彩管理是确保图像从捕捉到输出的一致性和准确性的关键。Lightroom 和 Photoshop 其实已经将这套色彩管理流程作为默认选项,如果实质操作时仍存在色彩偏差的问题,可参考以下内容。 ProPhoto RGB > Adobe RGB > sRGB …

【Android面试八股文】性能优化相关面试题:如何查找CPU占用?

文章目录 一、 如何查找CPU的占用问题二、TraceView的使用关于TraceView和Android Studio的Profiler第一步、通过Android studio 打开`Android profiler`第二步、使用步骤第三步、技术说明第四步、CPU占用相关指标说明扩展阅读一、 如何查找CPU的占用问题 在Android开发中,如…

linux 控制台非常好用的 PS1 设置

直接上代码 IP$(/sbin/ifconfig eth0 | awk /inet / {print $2}) export PS1"\[\e[35m\]^o^\[\e[0m\]$ \[\e[31m\]\t\[\e[0m\] [\[\e[36m\]\w\[\e[0m\]] \[\e[32m\]\u\[\e[0m\]\[\e[33m\]\[\e[0m\]\[\e[34m\]\h(\[\e[31m\]$IP\[\e[m\])\[\e[0m\]\n\[\e[35m\].O.\[\e[0m\]…

Golang内存分配

Go内存分配语雀笔记整理 Golang内存模型设计理念思考核心代码阅读mspanmcachemcentral中心缓存mheap分配过程 Golang内存模型设计理念思考 golang内存分配基于TCmalloc模型,它核心在于:空间换时间,一次缓存,多次复用;…

HarmonyOS开发探索:父子组件手势绑定问题处理

场景一:父子组件同时绑定手势的冲突处理 效果图 方案 在默认情况下,手势事件为非冒泡事件,当父子组件绑定相同的手势时,父子组件绑定的手势事件会发生竞争,最多只有一个组件的手势事件能够获得响应,默认子…

二、基础—常用数据结构:列表、元祖、集合、字典、函数等(爬虫及数据可视化)

二、基础—常用数据结构:列表、元祖、集合、字典、函数等(爬虫及数据可视化) 1,字符串2,最常用的是列表(重点掌握)3,元组4,字典(重要)5&#xff0…

【CSS in Depth 2 精译】2.3 告别像素思维

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem 2.2.1 使用 em 定义字号2.2.2 使用 rem 设置字号 2.3 告别像素思维 ✔️2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.3 告别…

3D交互可视化编辑器求推荐,最好是针对企业级使用的?

企业级使用的3D交互可视化编辑器,支持编辑和调整2D、3D渲染及交互设置,以下几款可以关注了解一下: 1、Unity:一个广泛使用的跨平台游戏引擎,由Unity Technologies开发。支持开发者创建2D和3D游戏、交互式应用以及虚拟…

pdf压缩,pdf压缩在线网页版,在线压缩pdf网站

在数字化时代,pdf文件已经成为我们工作、学习和生活中不可或缺的一部分。然而,pdf文件往往体积庞大,传输效率低下,还占用大量存储空间。如何在不影响文件质量的前提下,减小pdf文件的大小呢?今天&#xff0c…

74HC595芯片验证

目录 0x00 74595芯片简介0x01 实现原理 0x00 74595芯片简介 74595芯片有很多种封装,不管是贴片的还是直插式的,它们的引脚定义都如下图所示: 其中 : Q0-Q7为并行数据输出口,可以输出高低电平。OE 为使能引脚&#…

SpringBoot3集成MyBatisPlus

介绍 使用SpringBoot3集成MyBatisPlus&#xff0c;进行项目开发。这里分XX进行整合。 第一步&#xff1a;创建SpringBoot3项目 创建项目时选择MySQL和Web的依赖。作者在这里使用的SpringBoot版本是3.2.4。 第二步&#xff1a;添加MybatisPlus相关依赖 <!--mybatis-plus…

Linux 常用命令之 split

概述 在Linux系统中&#xff0c;split是一个非常实用的命令行工具&#xff0c;用于将一个大文件分割成多个小文件。这对于处理大型日志文件或备份大文件时非常有用。split命令提供了多种选项&#xff0c;允许用户根据文件大小或行数来分割文件。 一、split命令的基本用法 sp…

MySQL之高可用性和应用层优化(一)

高可用性 故障转移和故障恢复 在应用中处理故障转移 有时候让应用来处理故障转移会更加简单或者更加灵活。例如&#xff0c;如果应用遇到一个错误&#xff0c;这个错误外部观察者正常情况下是无法察觉的&#xff0c;例如关于数据库损坏的错误日志信息&#xff0c;那么应用可…

解决mybastis-plus加入逻辑删除SQL语句自动拼接未删除的问题

配置逻辑删除 在bootstrap.yaml中加入逻辑删除配置 mybatis-plus:global-config:db-config:logic-delete-field: isDeleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)logic-delete-value: true # 逻辑已删除值(默认为 1)logic-not-delete-value: …

Redis学习(12)|使用Redis在Spring Boot中实现分布式锁

文章目录 使用场景优缺点优点缺点 注意事项实现步骤1. 添加依赖2. 配置Redis连接3. 实现分布式锁逻辑3.1 创建Redis配置类3.2 创建RedisLock类3.3 使用RedisLock实现分布式锁 最佳实践 Hello大家好&#xff0c;我是阿月&#xff0c;坚持学习&#xff0c;老年痴呆追不上我&#…