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.mfbz.cn/a/763551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样使用js技术实现Chrome投屏功能?

在Web前端技术中,直接控制浏览器窗口或标签页从主屏投屏到副屏(如PPT的演讲者模式)并不简单,而且直接控制浏览器窗口从主屏投屏到副屏的功能超出了Web标准的范畴,并且涉及到用户系统级别的设置和权限,因此不…

正确认识手机NFC,安全无风险

在数字化生活日益普及的今天,NFC(近场通信)技术以其独特的便捷性和高效性,逐渐成为了我们日常生活中不可或缺的一部分。然而,面对新技术的崛起,总有一些用户对于其安全性心存疑虑,尤其是关于“N…

(一)Docker基本介绍

部署项目的发展 传统部署适合需要最大性能和可靠性的场景,但在资源利用和管理方面有显著劣势。虚拟化部署提供了良好的资源利用率和隔离性,适用于需要灵活扩展和多租户环境的场景,但存在性能开销。容器部署在轻量级、可移植性和资源利用率方面…

JVM线上监控环境搭建Grafana+Prometheus+Micrometer

架构图 一: SpringBoot自带监控Actuator SpringBoot自带监控功能Actuator&#xff0c;可以帮助实现对程序内部运行情况监控&#xff0c;比如监控内存状况、CPU、Bean加载情况、配置属性、日志信息、线程情况等。 使用步骤&#xff1a; 1. 导入依赖坐标 <dependency><…

Omni3D目标检测

Omni3D是一个针对现实场景中的3D目标检测而构建的大型基准和模型体系。该项目旨在推动从单一图像中识别3D场景和物体的能力&#xff0c;这对于计算机视觉领域而言是一个长期的研究目标&#xff0c;并且在机器人、增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&a…

7.1.SQL注入-基于函数报错的方式来利用updatexml()

基于函数报错的方式来进行利用-字符型&#xff08;本页updatexml()&#xff09; 前提条件是后台数据库没有屏蔽数据库语法报错信息 updatexml()方法详解 注释&#xff1a; 第一个参数&#xff0c;意思就是xml文档的名称 第二个参数&#xff0c;意思就是定位到xml文档中指定…

PriorityQueue底层你了解多少?(带你彻底掌握优先级队列)

1. 概念 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如:在手机上玩游戏的时…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…

D - Intersecting Intervals(abc355)

题意&#xff1a;有n个区间&#xff0c;找出俩俩区间相交的个数 分析&#xff1a; 设初始俩俩相交&#xff0c;找出不相交的&#xff08;不同区间l>r)&#xff0c;减去即可 #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ ios:…

大力出奇迹:大语言模型的崛起与挑战

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大语言模型&#xff08;LLM&#xff09;的出现与应用&#xff0c;彻底改变了我们与机器互动的方式。本文将探讨ChatGPT等大语言模型的定义、…

Hive-存储-文件格式

一、前言 数据存储是Hive的基础&#xff0c;选择合适的底层数据存储格式&#xff0c;可以在不改变Hql的前提下得到大的性能提升。类似mysql选择适合场景的存储引擎。 Hive支持的存储格式有 文本格式&#xff08;TextFile&#xff09; 二进制序列化文件 &#xff08;SequenceF…

期末复习---程序填空

注意&#xff1a; 1.数组后移 *p *(p-1) //把前一个数赋值到后一个数的位置上来覆盖后一个数 2.指针找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指针指向这个已经找到的最大位置&#xff1b;!!!!!!!!! } p; //因为开始没有next &#xff…

Fragment+Viewpage2+FragmentStateAdapter实现滑动式标签布局

大家好&#xff0c;我是网创有方&#xff0c;今天记录下标签布局的实现方法&#xff0c;先看下效果图。 第一步&#xff1a;编写一个activity或者fragment。内含有一个viewpager2的适配器&#xff0c;适配器类型为FragmentStateAdapter。 ​ public class MediaCreateFragment…

计算机图形学入门22:双向反射分布函数(BRDF)

1.定义 所谓BRDF&#xff08;Bidirectional Reflectance Distribution Function&#xff0c;双向反射分布函数&#xff09;&#xff0c;指的是从辐射度量学的角度去理解光线的反射&#xff0c;如下图所示。 所谓反射就是一个点从ωi方向发出的Radiance转化为dA接收到的功率E&am…

在jeesite框架中增加一个收藏夹功能-- V1.0版本

Jeesite简介&#xff1a;JeeSite 快速开发平台&#xff0c;不仅仅是一个后台开发框架&#xff0c;它是一个企业级快速开发解决方案&#xff0c;提供在线数据源管理、数据表建模、代码生成等功能。 正文&#xff1a;Jeesite是一个方便实用&#xff0c;适合敏捷开发&#xff0c;提…

openmetadata1.3.1 自定义连接器 开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

Webpack: 其他性能优化

概述 前面章节我们已经详细探讨 Webpack 中如何使用分包、代码压缩提升应用执行性能。除此之外&#xff0c;还有不少普适、细碎的方法&#xff0c;能够有效降低应用体积&#xff0c;提升网络分发性能&#xff0c;包括&#xff1a; 使用动态加载&#xff0c;减少首屏资源加载量&…

Adobe Photoshop 2024 v25.5.1 中文激活版下载以及安装方法教程

软件介绍 Adobe Photoshop 2024 v25.5.1 是Adobe公司的最新版图像处理软件&#xff0c;它提供了强大的图像编辑工具和智能自动化功能&#xff0c;包括图像修复、色彩校正和滤镜效果&#xff0c;以满足专业人士和业余爱好者的需求。这款软件还支持矢量图形设计和实时协作&#…

一维信号短时傅里叶变换域邻域降噪方法(MATLAB)

噪声在人类日常生活中无处不在,其会降低语音信号的质量和可懂度。在低信噪比的恶劣环境中,这种负面影响愈发严重。为了解决这个问题,众多研究人员在过去的几十年里提出了许多降噪算法。 根据原理的不同,降噪算法可大致分为五类:谱减法、最优滤波法、基于统计模型的方法、子空间…

Java案例打印乘法口诀表,三角形

目录 一问题&#xff1a; ​编辑二代码&#xff1a; 三运行结果&#xff1a; 四问题 二代码&#xff1a; 三运行结果&#xff1a; 一问题&#xff1a; 二代码&#xff1a; package 重修;import java.util.Random; import java.util.Scanner;public class first {public …