Spring 设计模式:经典设计模式

Spring 设计模式:经典设计模式

引言

Spring 框架广泛使用了经典设计模式。

这些模式在 Spring 内部发挥着重要作用。

通过理解这些设计模式在 Spring 中的应用,开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。

经典设计模式

控制反转(IoC)与依赖注入(DI)

  • 应用场景:Spring 的核心机制。
  • 示例
// IoC与DI示例
public class UserService {
private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public void saveUser(User user) {userRepository.save(user);}}

工厂模式(Factory Pattern)

  • 应用场景:BeanFactory 和 ApplicationContext。
  • 示例
// 工厂模式示例:BeanFactory
public interface BeanFactory {Object getBean(String name);
}public class ApplicationContext implements BeanFactory {@Overridepublic Object getBean(String name) {// 返回Bean实例return new Object();}
}

单例模式(Singleton Pattern)

  • 应用场景:Spring 容器默认管理 Bean 的方式。
  • 示例
// 单例模式示例:Spring Bean
@Component
public class SingletonBean {// Bean的单例实例
}

代理模式(Proxy Pattern)

  • 应用场景:Spring AOP。
  • 示例
// 代理模式示例:AOP代理
public interface UserService {void saveUser(User user);
}public class UserServiceImpl implements UserService {@Overridepublic void saveUser(User user) {// 保存用户逻辑}
}public class UserServiceProxy implements UserService {private UserService userService;public UserServiceProxy(UserService userService) {this.userService = userService;}@Overridepublic void saveUser(User user) {System.out.println("Before saving user");userService.saveUser(user);System.out.println("After saving user");}}

模板方法模式(Template Method Pattern)

  • 应用场景:JdbcTemplate、JpaTemplate。
  • 示例
// 模板方法模式示例:JdbcTemplate
public abstract class JdbcTemplate {public void executeQuery(String sql) {// 模板方法openConnection();runQuery(sql);closeConnection();}protected abstract void runQuery(String sql);private void openConnection() {// 打开连接}private void closeConnection() {// 关闭连接}
}

策略模式(Strategy Pattern)

  • 应用场景:Spring 事务管理。
  • 示例
// 策略模式示例:事务管理
public interface TransactionStrategy {void execute();
}public class JdbcTransactionStrategy implements TransactionStrategy {@Overridepublic void execute() {// JDBC事务逻辑}
}public class JtaTransactionStrategy implements TransactionStrategy {@Overridepublic void execute() {// JTA事务逻辑}
}

观察者模式(Observer Pattern)

  • 应用场景:Spring 事件驱动模型。
  • 示例
// 观察者模式示例:事件监听
public class ApplicationEvent {// 事件内容
}public interface ApplicationListener {void onApplicationEvent(ApplicationEvent event);
}public class CustomEventListener implements ApplicationListener {@Overridepublic void onApplicationEvent(ApplicationEvent event) {// 处理事件}
}

装饰器模式(Decorator Pattern)

  • 应用场景:扩展或修改 Bean 的功能。
  • 示例
// 装饰器模式示例:DAO扩展
public interface UserDao {void saveUser(User user);
}public class UserDaoImpl implements UserDao {@Overridepublic void saveUser(User user) {// 保存用户逻辑}
}public class LoggingUserDaoDecorator implements UserDao {private UserDao userDao;public LoggingUserDaoDecorator(UserDao userDao) {this.userDao = userDao;}@Overridepublic void saveUser(User user) {System.out.println("Before saving user");userDao.saveUser(user);System.out.println("After saving user");}
}

门面模式(Facade Pattern)

  • 应用场景:Spring 的 ApplicationContext。
  • 示例
// 门面模式示例:ApplicationContext
public class ApplicationContext {public Object getBean(String name) {// 返回Bean实例return new Object();}
}

结论

Spring框架通过综合运用多种经典设计模式,实现了灵活性、扩展性和可维护性,满足了现代企业级应用开发的多样需求。

开发者应深入理解这些设计模式在 Spring 中的应用,以更好地掌握 Spring 框架的设计哲学和实现细节。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

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

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

相关文章

HTML课堂之搜索工具箱/讲师duluo

目录: 源码在最后 小提示: 1.养成打卡习惯没日多加练习即可提什能力 2.源码在最后,请先看完代码讲解,在尝试自己写,这样容易掌握 3.请勿复制粘贴,因为你没掌握,即使复制粘贴也学不会 课堂重点笔…

根据docker file 编译镜像

比如给到一个Dockerfile 第一步编译镜像 cd /path/to/Dockerfiledocker build -t <DOCKER_IMAGE_NAME> . build 命令编译镜像 -t 镜像名字 . 指dockerfile 所在目录 如果遇到报错 [] Building 0.3s (3/3) FINISHED …

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…

STM32-笔记39-SPI-W25Q128

一、什么是SPI&#xff1f; SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且 在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为…

pytest和unittest的区别

pytest 和 unittest 是 Python 中常用的两个测试框架。以下是对 pytest 和 unittest 的详细对比和说明&#xff1a; 目录 1. 简洁性和易用性 2. 灵活性和特性 3. 断言机制 4. 插件和扩展 5. 参数化测试 1. 简洁性和易用性 unittest 风格&#xff1a;unittest 是基于 x…

【微服务】8、分布式事务 ( XA 和 AT )

文章目录 利用Seata解决分布式事务问题&#xff08;XA模式&#xff09;AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…

CTF知识点总结(三)

空格绕过方式&#xff1a; $IFS ${IFS} $IFS$数字 < <> 三种绕过方式&#xff1a; 1.sh /?ip127.0.0.1;echo$IFS$2Y2F0IGZsYWcucGhw|base64$IFS$2-d|sh 2.变量拼接 /?ip127.0.0.1;ag;cat$IFS$2fla$a.php 3.内联注释(将反引号命令的结果作为输入来执行命令) /?i…

《Spring Framework实战》5:Spring Framework 概述

欢迎观看《Spring Framework实战》视频教程 Spring 使创建 Java 企业应用程序变得容易。它为您提供一切 需要在企业环境中采用 Java 语言&#xff0c;并支持 Groovy 和 Kotlin 作为 JVM 上的替代语言&#xff0c;并且可以灵活地创建许多 类型的架构。从 Spring Framework 6.0 开…

解决npm报错:sill idealTree buildDeps

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 报错信息 使用 npm 安装依赖时报错&#xff1a;sill idealTree buildDeps 解决方案 请按照以下步骤进行相关操作&#xff1a; 1、删除 C:\Users{账户}\ 文件夹中的 .npm…

【什么是MVCC?】

MVCC&#xff08;Multi - Version Concurrency Control&#xff09;即多版本并发控制。 一、背景和概念 在数据库系统中&#xff0c;并发控制是非常重要的。当多个事务同时访问和修改数据时&#xff0c;需要一种机制来确保数据的一致性和正确性。MVCC 是一种并发控制的技术&a…

递归构建树菜单节点

一、获取所有分类上下级信息 /*** 获取所有分类上下级信息*/ public R<List<ResearchTypeTreeVO>> getTypeTreeList(){//获取所有分类数据List<ResearchTypeVO> list ibResearchTypeService.getSuperList(null);List<ResearchTypeTreeVO> researchTy…

PHP语言的正则表达式

PHP语言中的正则表达式详解 引言 在编程中&#xff0c;字符串处理是一个非常常见的问题&#xff0c;而正则表达式&#xff08;Regular Expressions&#xff0c;简称Regex&#xff09;则是高效处理字符串的强大工具。PHP作为一种广泛应用的服务器端编程语言&#xff0c;也提供…

键盘过滤驱动

概述 irp请求会从io管理器中传递到设备栈中依次向下发送&#xff0c;当到达底层真实设备处理完成后&#xff0c;会依次返回&#xff0c;这时如果在设备栈中有我们自己注册的设备&#xff0c;就可以起到一个过滤的功能。键盘过滤驱动就是如此&#xff0c;通过附加到原本存在的设…

Ubuntu上安装Apache Spark

在Ubuntu上安装Apache Spark的步骤如下&#xff1a; 1. 安装Java Spark是用Scala编写的&#xff0c;并且依赖Java。因此&#xff0c;首先需要安装Java。 安装OpenJDK 8&#xff08;或更高版本&#xff09; 执行以下命令安装OpenJDK&#xff1a; sudo apt update sudo apt …

formik 的使用

礼记有言&#xff1a;独学而无友&#xff0c;则孤陋而寡闻 让我们一起了解更多便捷方法&#xff0c;缩短开发时间去摸鱼&#xff0c;嘿嘿。 框架&#xff1a;react 在写表单的时候&#xff0c;我不太喜欢把验证写的很繁琐&#xff0c;这里讲介绍&#xff0c;验证表单的非常好用…

JVM实战—OOM的生产案例

1.每秒仅上百请求的系统为何会OOM(RPC超时时间设置过长导致QPS翻几倍) (1)案例背景 在这个案例中&#xff0c;一个每秒仅仅只有100请求的系统却因频繁OOM而崩溃。这个OOM问题会涉及&#xff1a;Tomcat底层工作原理、Tomcat内核参数的设置、服务请求超时时间。 (2)系统发生OOM的…

数字IC设计高频面试题

在数字IC设计领域&#xff0c;面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题&#xff0c;以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…

Leetcode 3412. Find Mirror Score of a String

Leetcode 3412. Find Mirror Score of a String 1. 解题思路2. 代码实现 题目链接&#xff1a;3412. Find Mirror Score of a String 1. 解题思路 这一题就是一道典型的栈的题目&#xff0c;我们对每一个字符构造一个栈&#xff0c;然后考察每一个元素的mirror元素是否当前存…

测试开发基础知识2

10.什么是等价类和边界值法&#xff1f; 1)等价类划分 等价类划分是将系统的输入域划分为若干部分&#xff0c;然后从每个部分选取少量代表性数据进行测试。等价类划分认为如果一个测试用例在某个等价类中的一个值上通过测试&#xff0c;那么它在这个类中的其他值上也…

PHP在做api开发中,RSA加密签名算法如何使用 ?

RSA 加密是什么 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是最早的公钥密码系统之一&#xff0c;广泛用于安全数据传输。3 位数学家 Rivest、Shamir 和 Adleman 的名字来命名的。 是非对称加密的一种 这种算法非常可靠&#xff0c;密钥越长&#xff0c;它就越难破解。…