Spring⾥⽤到的设计模式

Spring 框架是一个广泛应用于企业级 Java 开发的开源框架,它提供了一系列的模块,包括依赖注入、面向切面编程、事务管理等功能,以简化企业级应用的开发。在 Spring 的设计和实现中,采用了多种设计模式来解决不同的问题,提高代码的可维护性、可扩展性和可重用性。

1. 单例模式(Singleton Pattern)

单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在 Spring 中,单例模式广泛用于管理 Bean 的生命周期。Spring 容器默认情况下会将所有的 Bean 定义为单例,即在容器中仅存在一个实例,并且在第一次请求时创建。

public class MySingletonBean {private static final MySingletonBean instance = new MySingletonBean();private MySingletonBean() {// 私有构造方法}public static MySingletonBean getInstance() {return instance;}
}

Spring 的单例模式确保了在整个应用程序中只有一个 Bean 实例,从而减少了资源消耗和提高了性能。但需要注意的是,单例模式可能引入状态共享的问题,因此在设计时需要考虑线程安全性。

2. 工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装起来的方式。在 Spring 中,工厂模式常常用于创建和管理 Bean 对象。Spring 容器通过工厂模式来管理和创建 Bean,用户只需要配置相应的 Bean 定义,而无需直接调用构造函数。

public interface MyBean {void doSomething();
}public class MyBeanImpl implements MyBean {@Overridepublic void doSomething() {// 具体实现}
}public class MyBeanFactory {public MyBean createBean() {return new MyBeanImpl();}
}

Spring 提供了多种工厂模式的实现,包括简单工厂模式、工厂方法模式和抽象工厂模式。通过配置文件或注解,Spring 容器可以根据用户的需求选择适当的工厂模式来创建和管理 Bean。

3. 代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对其他对象的访问。在 Spring 中,代理模式常被用于实现 AOP(面向切面编程)。

Spring AOP 使用代理模式来实现横切关注点的模块化,将横切关注点(例如日志记录、事务管理)从业务逻辑中分离出来。Spring 提供两种代理模式:静态代理和动态代理。

3.1 静态代理

public interface MyService {void doSomething();
}public class MyServiceImpl implements MyService {@Overridepublic void doSomething() {// 具体实现}
}public class MyServiceProxy implements MyService {private final MyService target;public MyServiceProxy(MyService target) {this.target = target;}@Overridepublic void doSomething() {// 执行横切关注点(例如日志记录)System.out.println("Before method execution");// 调用目标对象的方法target.doSomething();// 执行横切关注点(例如事务管理)System.out.println("After method execution");}
}

3.2 动态代理

public interface MyService {void doSomething();
}public class MyServiceImpl implements MyService {@Overridepublic void doSomething() {// 具体实现}
}public class MyInvocationHandler implements InvocationHandler {private final Object target;public MyInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 执行横切关注点(例如日志记录)System.out.println("Before method execution");// 调用目标对象的方法Object result = method.invoke(target, args);// 执行横切关注点(例如事务管理)System.out.println("After method execution");return result;}
}

动态代理通过 java.lang.reflect.Proxy 类和 InvocationHandler 接口实现,可以在运行时动态生成代理类,而不需要提前定义。

4. 观察者模式(Observer Pattern)

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在 Spring 中,观察者模式被广泛应用于事件驱动编程和消息通知。

Spring 的事件机制就是基于观察者模式实现的。通过定义事件、监听器和发布器,应用程序可以轻松实现组件之间的解耦和通信。

public class MyEvent extends ApplicationEvent {// 自定义事件类public MyEvent(Object source) {super(source);}
}public class MyListener implements ApplicationListener<MyEvent> {// 自定义监听器类@Overridepublic void onApplicationEvent(MyEvent event) {// 处理事件}
}public class MyPublisher {// 事件发布器private final ApplicationEventPublisher eventPublisher;public MyPublisher(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void publishEvent() {// 发布事件eventPublisher.publishEvent(new MyEvent(this));}
}

5. 策略模式(Strategy Pattern)

策略模式是一种行为型设计模式,它定义了一族算法,将每个算法封装起来,并使它们可以互相替换。在 Spring 中,策略模式常被用于定义和管理一系列可互换的算法或行为。

Spring 中的事务管理就是一个典型的策略模式的应用。Spring 提供了多种事务管理的策略,包括编程式事务管理和声明式事务管理,用户可以根据需要选择合适的策略。

public interface TransactionStrategy {void beginTransaction();void commit();void rollback();
}public class ProgrammaticTransactionStrategy implements TransactionStrategy {// 编程式事务管理策略的具体实现@Overridepublic void beginTransaction() {// 实现具体的事务开始逻辑}@Overridepublic void commit() {// 实现具体的事务提交逻辑}@Overridepublic void rollback() {// 实现具体的事务回滚逻辑}
}public class DeclarativeTransactionStrategy implements TransactionStrategy {// 声明式事务管理策略的具体实现@Overridepublic void beginTransaction() {// 实现具体的事务开始逻辑}@Overridepublic void commit() {// 实现具体的事务提交逻辑}@Overridepublic void rollback() {// 实现具体的事务回滚逻辑}
}

通过定义一个通用的接口,可以轻松地切换和扩展不同的事务管理策略,而不影响业务逻辑的实现。

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

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类。在 Spring 中,模板方法模式常被用于定义一些通用的算法骨架,以便子类可以按需实现具体步骤。

Spring 的 JdbcTemplate 就是模板方法模式的一个例子。JdbcTemplate 定义了一系列执行数据库操作的方法,其中一些步骤是通用的,而一些是具体的,由子类实现。

public abstract class JdbcTemplate {public final void execute() {// 通用步骤1getConnection();// 具体步骤由子类实现doExecute();// 通用步骤2releaseConnection();}protected abstract void doExecute();private void getConnection() {// 获取数据库连接的通用实现}private void releaseConnection() {// 释放数据库连接的通用实现}
}public class MyJdbcTemplate extends JdbcTemplate {@Overrideprotected void doExecute() {// 具体步骤的实现}
}

通过模板方法模式,JdbcTemplate 将通用的数据库操作流程封装在 execute 方法中,而具体的操作由子类实现,实现了算法的复用和业务逻辑的分离。

7. 适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。在 Spring 中,适配器模式常被用于解决接口不兼容的问题。

Spring MVC 中的 HandlerAdapter 就是适配器模式的一个应用。HandlerAdapter 负责将处理请求的 Controller 转换成合适的处理器,以适应不同的 Controller 接口。

public interface Controller {void handleRequest();
}public class SimpleController implements Controller {@Overridepublic void handleRequest() {// 处理请求的具体实现}
}public class SimpleControllerHandlerAdapter implements HandlerAdapter {private final SimpleController controller;public SimpleControllerHandlerAdapter(SimpleController controller) {this.controller = controller;}@Overridepublic boolean supports(Object handler) {return handler instanceof SimpleController;}@Overridepublic void handle(Object handler) {controller.handleRequest();}
}

通过适配器模式,SimpleControllerHandlerAdapter 将 SimpleController 转换成 HandlerAdapter 接口,使得它可以被 Spring MVC 框架正确地处理。

最后

Spring 框架广泛应用了多种设计模式,这些设计模式在提高代码的可维护性、可扩展性和可重用性方面发挥了重要作用。通过单例模式、工厂模式、代理模式、观察者模式、策略模式、模板方法模式和适配器模式等设计模式的应用,Spring 实现了面向对象设计原则,使得框架更加灵活、可扩展和易于维护。熟练掌握这些设计模式有助于开发者更好地理解和使用 Spring 框架,提高代码质量和开发效率。

黑马程序员新版Spring零基础入门到精通,一套搞定spring全套视频教程(含实战源码)

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

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

相关文章

【边缘计算的挑战和机遇】-未来可期

边缘计算的挑战和机遇 ***背景&#xff1a; *边缘计算面临着数据安全与隐私保护、网络稳定性等挑战&#xff0c;但同时也带来了更强的实时性和本地处理能力&#xff0c;为企业降低了成本和压力&#xff0c;提高了数据处理效率。因此&#xff0c;边缘计算既带来了挑战也带来了机…

农用拖拉机市场调研:预计2029年将达到171亿美元

由于近些年来新兴市场的迅速崛起和技术创新的不断涌现&#xff0c;全球农用拖拉机市场的竞争也日趋激烈。生产商不仅需要提供质量可靠的产品&#xff0c;还需要提供良好的售后服务以赢得客户的信赖。 农业是支撑国民经济建设与发展的基础产业&#xff0c;而农业机械化是建设现代…

2024杭州国际智慧城市,人工智能,安防展览会(杭州智博会)

在智能化浪潮的冲击下&#xff0c;我们的生活与环境正在经历一场深刻的变革。这是一场前所未有的技术革命&#xff0c;它以前所未有的速度和广度&#xff0c;改变着我们的生活方式、工作方式、思维方式和社会结构。在这场变革中&#xff0c;有的人选择激流勇进&#xff0c;拥抱…

ACL实验

一&#xff1a;实验要求 二&#xff1a;实验分析 PC1可以telnet R1但不能ping通R1 PC1可以ping通R2但不能telnet R2 PC2可以ping通R1但不能telnet R1 PCR可以telnet R2但不能ping通R2 三&#xff1a;实验过程 配置IP 配置静态路由 检查是否全网可通 配置Telnet r1创建…

Xshell无法ssh连接虚拟机问题或主机无法ping通虚拟机。

常见报错如下&#xff1a; 1&#xff0c;Could not connect to ‘&#xff1f;&#xff1f;&#xff1f;’ (port 22): Connection failed. 2&#xff0c;卡在To escape to local shell, press ‘CtrlAlt]’. 3&#xff0c;Connection closing…Socket close. Connection clos…

SpringBoot-03

SpringBoot3整合Druid数据源 创建程序引入依赖启动类配置文件编写编写Controller启动测试问题解决 spring:datasource:# 连接池类型 type: com.alibaba.druid.pool.DruidDataSource# Druid的其他属性配置 springboot3整合情况下,数据库连接信息必须在Druid属性下!druid:url: …

一款轻量级、基于Java语言开发的低代码开发框架,开箱即用!

数字化时代&#xff0c;企业对于灵活、高效和安全的软件开发需求日益旺盛。为了满足这些需求&#xff0c;许多组织转向低代码技术&#xff0c;以寻求更具成本效益和创新性的解决方案。JNPF基础框架正是在这一背景下应运而生&#xff0c;凭借其私有化部署和100%源码交付的特性&a…

Unity之铰链关节和弹簧组件

《今天闪电侠他回来了&#xff0c;这一次他要拿回属于他的一切》 目录 &#x1f4d5;一、铰链关节组件HingeJoint 1. 实例 2. 铰链关节的坐标属性 ​3.铰链关节的马达属性Motor &#x1f4d5;二、弹簧组件 &#x1f4d5;三、杂谈 一、铰链关节组件HingeJoint 1. 实例 说…

【STM32调试】寄存器调试不良问题记录持续版

STM32寄存器调试不良问题记录 NVIC&#xff08;内嵌的中断向量控制器&#xff09;EXTI&#xff08;外部中断/事件&#xff09; 记录一些stm32调试过程中&#xff1a;不易被理解、存在使用误区、不清不楚、是坑、使用常识等方面的一些记录。本记录只包含stm32的内核以及外设等寄…

GAM:保留信息以增强通道-空间交互

摘要 为了提高各种计算机视觉任务的表现,已经研究了多种注意力机制。然而,之前的方法忽视了在通道和空间两个方面保留信息以增强跨维度交互的重要性。因此,我们提出了一种全局注意力机制,通过减少信息减少和放大全局交互表示来提高深度神经网络的表现。我们引入了与多层感…

从uptime看linux平均负载

从前遇到系统卡顿只会top。。top看不出来怎么搞呢&#xff1f; Linux系统提供了丰富的命令行工具&#xff0c;以帮助用户和系统管理员监控和分析系统性能。在这些工具中&#xff0c;uptime、mpstat和pidstat是非常有用的命令&#xff0c;它们可以帮助你理解系统的平均负载以及资…

短信系统搭建主要因素|网页短信平台开发源码

短信系统搭建主要因素|网页短信平台开发源码 随着移动互联网的快速发展&#xff0c;短信系统已成为企业和个人进行信息传递的重要工具。建立一个高效可靠的短信系统对于企业来说非常重要。下面我们将介绍一些影响短信系统搭建的主要因素。 1. 平台选择&#xff1a;在搭建短信系…

2018年认证杯SPSSPRO杯数学建模B题(第一阶段)动态模糊图像全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 B题 动态模糊图像 原题再现&#xff1a; 人眼由于存在视觉暂留效应&#xff0c;所以看运动的物体时&#xff0c;看到的每一帧画面都包含了一段时间内 (大约 1/24 秒) 的运动过程&#xff0c;所以这帧画面事实上是模糊的。对电影的截图来说&…

PyQt5零基础入门(五)——QLabel显示图像

QLabel显示图像 前言显示静态图片显示动态图 前言 QLabel是Qt库中的一个部件&#xff0c;通常用于显示文本或富文本文档。然而&#xff0c;QLabel也可以用来显示图像。 一种常见的使用QLabel显示图像的方法是使用QPixmap类。QPixmap可以从文件中接收图片&#xff0c;然后可以…

Qt基础-QSlider控件使用

目录 定义 QAbstractSlider属性 属于QSlider 的专有属性 颜色生成实例 定义 QSlider控件是滑动的标尺组件,滑动标尺上的一个滑块可以改变值。从QAbstractSlider继承。

2024年WebGIS开发三维面试题及答案解析

​前言 简介 面试之前 面试流程 自我介绍 1 面试简介 1 、首先做一个简单的自我介绍 2 、在公司/学习中做了什么样的项目&#xff1f; 在项目中参与哪些模块&#xff1f;重点介绍做了哪些功能? 3 、用户名/密码传输给后台的时候是加密传输还是明文传输 4 、token如何校…

多模态、长文本、智能体,智谱AI推出GLM-4模型全家桶,发布即上线

2024年01月16日&#xff0c;智谱AI首届技术开放日(Zhipu DevDay)在北京中关村国家自主创新示范区展示中心成功举办。现场&#xff0c;智谱AI团队全面展示了其投身于大模型事业三年多来所积累的技术成果&#xff0c;并重磅发布了新一代基座大模型GLM-4。 此次GLM-4的发布及上线&…

C#调用Newtonsoft.Json将bool序列化为int

使用Newtonsoft.Json将数据对象序列化为Json字符串时&#xff0c;如果有布尔类型的属性值时&#xff0c;一般会将bool类型序列化为字符串&#xff0c;true值序列化为true&#xff0c;false值序列化为false。如下面的类型序列化后的结果如下&#xff1a; public class UserInfo…

开源图床LightPicture搭建本地图片管理系统并实现无公网IP远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

OSI七层协议和五层协议

【 1 】互联网协议交互的基础 硬件设备 光缆 【 2 】OSI七层协议 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责传输比特流&#xff08;0和1&#xff09;以及物理连接的建立和维护。数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;提供可…