Spring 框架中都用到了哪些设计模式?

Spring框架是一个全功能的企业级Java应用开发框架,它提供了广泛的功能,包括依赖注入、面向切面编程、事务管理等。在Spring的实现中,使用了多种设计模式来实现这些功能,以提高代码的可维护性、可扩展性和灵活性。本文将深入讨论Spring框架中使用的一些主要设计模式。

1. 单例模式(Singleton Pattern)

单例模式是一种创建型设计模式,其主要目的是确保类只有一个实例,并提供一个全局访问点。在Spring中,Bean的默认作用域就是单例(Singleton),这意味着在整个应用程序中只有一个Bean实例,由Spring容器负责管理。

单例模式可以确保在应用程序中只存在一个共享的实例,从而节省资源并提高性能。在Spring中,单例模式广泛应用于管理Bean,例如Service层的业务逻辑组件、DAO层的数据访问组件等。

@Service
public class MyService {// ...
}

2. 工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。在Spring中,工厂模式通过Bean工厂来创建和管理Bean。

Spring中的Bean工厂(例如ApplicationContext)负责创建和配置Bean,隐藏了具体实例化的细节,使得应用程序更易于扩展和维护。工厂模式有助于将对象的创建和配置过程解耦,提高了代码的可维护性。

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}

3. 代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,它允许通过代理类控制对其他对象的访问。在Spring AOP(面向切面编程)中,代理模式被广泛用于实现横切关注点的代码分离,例如日志记录、事务管理等。

Spring通过动态代理和CGLIB(Code Generation Library)来实现代理模式。动态代理可以在运行时创建代理类,而CGLIB可以在编译时生成代理类的字节码。

public interface MyService {void doSomething();
}public class MyServiceImpl implements MyService {public void doSomething() {// 实际业务逻辑}
}public class MyServiceProxy implements MyService {private MyService target;// 构造函数注入目标对象public MyServiceProxy(MyService target) {this.target = target;}public void doSomething() {// 在实际业务逻辑执行前后添加额外的操作System.out.println("Before calling doSomething()");target.doSomething();System.out.println("After calling doSomething()");}
}

4. 观察者模式(Observer Pattern)

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

Spring的事件机制允许应用程序中的组件发布和监听事件,从而实现解耦和灵活性。通过观察者模式,不同的组件可以对应用程序中发生的事件做出响应,而不需要显式的调用。

@Component
public class EventPublisher {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void publishEvent(String message) {MyEvent customEvent = new MyEvent(this, message);eventPublisher.publishEvent(customEvent);}
}@Component
public class EventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {// 处理事件System.out.println("Received custom event: " + event.getMessage());}
}

5. 策略模式(Strategy Pattern)

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。在Spring中,策略模式常用于定义不同的Bean实现,并根据需要在运行时动态切换它们。

Spring的@Qualifier注解和@Primary注解就是策略模式的一种应用,它们允许开发者选择特定的Bean实现或者指定默认的实现。

public interface PaymentStrategy {void pay();
}@Component
@Qualifier("creditCard")
public class CreditCardPayment implements PaymentStrategy {public void pay() {// Credit card payment logic}
}@Component
@Qualifier("paypal")
public class PaypalPayment implements PaymentStrategy {public void pay() {// Paypal payment logic}
}
@Service
public class ShoppingCart {private final PaymentStrategy paymentStrategy;@Autowiredpublic ShoppingCart(@Qualifier("paypal") PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout() {// 其他购物车结算逻辑paymentStrategy.pay(); // 根据配置的策略执行支付}
}

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

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤推迟到子类中实现。在Spring中,模板方法模式被广泛应用于定义一些基础设施的模板,例如Spring中JdbcTemplate。

JdbcTemplate是Spring提供的用于简化JDBC操作的模板类,它封装了一些常见的JDBC操作,同时提供了回调机制,允许开发者在执行SQL语句的过程中插入自定义的逻辑。这正是模板方法模式的应用。

public abstract class JdbcTemplate {public final void execute(String sql) {// 公共逻辑DataSource dataSource = getDataSource();Connection connection = dataSource.getConnection();try {// 子类实现的具体逻辑Statement statement = connection.createStatement();statement.execute(sql);} catch (SQLException e) {// 异常处理逻辑e.printStackTrace();} finally {// 关闭资源逻辑connection.close();}}protected abstract DataSource getDataSource();
}public class MyJdbcTemplate extends JdbcTemplate {@Overrideprotected DataSource getDataSource() {// 返回特定的数据源return new MyDataSource();}
}

7. 装饰器模式(Decorator Pattern)

装饰器模式是一种结构型设计模式,它允许向一个对象添加新的行为,而无需修改其代码。在Spring中,AOP中的切面就是装饰器模式的一种应用,它允许在不改变原有业务逻辑的情况下,动态地添加新的功能。

public interface MyService {void doSomething();
}@Service
public class MyServiceImpl implements MyService {public void doSomething() {// 实际业务逻辑}
}@Aspect
@Component
public class MyAspect {@Before("execution(* com.example.MyService.doSomething(..))")public void beforeDoSomething() {// 在实际业务逻辑执行前添加额外的操作System.out.println("Before calling doSomething()");}
}

8. 适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。在Spring中,适配器模式被用于适应不同的框架或技术,使它们能够与Spring框架集成。

例如,Spring的JpaVendorAdapter就是一个适配器,它允许开发者在Spring应用中使用不同的JPA提供商(如Hibernate、EclipseLink)而不需要修改应用代码。

@Configuration
public class JpaConfig {@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,DataSource dataSource) {return builder.dataSource(dataSource).packages("com.example.domain").persistenceUnit("myUnit").build();}@Beanpublic JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {return new JpaTransactionManager(entityManagerFactory);}@Beanpublic JpaVendorAdapter jpaVendorAdapter() {HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();adapter.setShowSql(true);adapter.setGenerateDdl(false);adapter.setDatabase(Database.H2);return adapter;}
}

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

最后

Spring框架作为一个全功能的企业级Java应用开发框架,巧妙地运用了多种设计模式,包括但不限于单例模式、工厂模式、代理模式、观察者模式、策略模式、模板方法模式、装饰器模式和适配器模式。这些设计模式的使用使得Spring框架更具灵活性、可维护性和可扩展性,同时提高了代码的可读性和可理解性。通过深入了解这些设计模式在Spring框架中的应用,开发者可以更好地理解框架的设计思想,从而更加高效地使用和扩展Spring框架。

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

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

相关文章

工作:三菱PLC程序开发流程总结

工作&#xff1a;三菱PLC程序开发流程总结 一、程序流程图 程序流程图是逻辑思维与动作流程的检查图&#xff0c;是保证逻辑思维合理的前提&#xff0c;写代码丢失方向可从程序流程图重新整理&#xff0c;程序流程图非常重要。 二、组态配置 组态配置是将所用到的基板和模块…

React基础巩固日志1

书写了一篇vue3的基础构建之后&#xff0c;不能带着各位一起学习vue3了&#xff0c;因为我要面试上海的前端岗位了&#xff0c;所以从现在开始&#xff0c;我要带着大家一起学习React了。 以下是我使用react书写的要掌握的react的知识点&#xff1a; ** ** 那么下面我们就一一通…

不做数据采集,不碰行业应用,专注数字孪生PaaS平台,飞渡科技三轮融资成功秘诀

12月15日&#xff0c;飞渡科技在北京举行2023年度投资人媒体见面会&#xff0c;全面分享其产品技术理念与融资之路。北京大兴经开区党委书记、管委会主任常学智、大兴经开区副总经理梁萌、北京和聚百川投资管理有限公司&#xff08;以下简称“和聚百川”&#xff09;投资总监严…

【Qt之Quick模块】2.创建Qt Quick UI工程

前言 上个文档对Qucik模块进行了概述&#xff0c;及创建Quick应用程序流程。 这个文档是创建Quick UI工程。 Qt Quick UI原型 Qt Quick UI原型项目对于测试或原型化用户界面非常有用&#xff0c;或者只是为了进行QML编辑而设置一个单独的项目。但是不能用它们进行应用程序开…

Axure情形动作篇(ERP登录效验)

目录 一、ERP系统用户登录效验 1.1 完成步骤 1.2 最终效果 二、省市区联动 三、ERP菜单栏页面跳转 四、下拉加载效果实现 4.1 加载动画实现步骤 4.2 下划界面加载实现 4.3 最终效果 一、ERP系统用户登录效验 1.1 完成步骤 首先搭建ERP系统的登录界面&#xff08;输入…

【Spring】12 EmbeddedValueResolverAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架提供了许多回调接口&#xff0c;以便开发者在 Bean 的生命周期中执行一些特定操作。其中之一是 EmbeddedValueResolverAware 接口&#xff0c;本文将深入探…

Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述

一、Android Studio&#xff08;3.6.2版本&#xff09;安装 java2smali 插件 1、左上角File—>Setting&#xff0c;如下图 2、Setting界面中&#xff1a;点击Plugins—>选择右侧上方Marketplace—>搜索栏输入java2smali&#xff0c;如下图 3、点击Install按钮—>点…

【每日一题】—— C. Largest Subsequence(Codeforces Round 915 (Div. 2))(规律、字符串处理)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

计算机存储精度引起的模型数值问题

引起数学模型数值问题的原因有很多种&#xff0c;例如前面的文章《约束系数的四舍五入引起的模型数值问题》提到&#xff0c;对约束系数的四舍五入&#xff0c;会损失一定的系数精度信息&#xff0c;导致约束面发生一定的偏移&#xff0c;这种偏移无论多么轻微&#xff0c;都有…

python图像二值化处理

目录 1、双峰法 2、P参数法 3、迭代法 4、OTSU法 图像的二值化处理是将图像上的像素点的灰度值设置为0或255&#xff0c;也就是将整个图像呈现出明显的只有黑和白的视觉效果。二值化是图像分割的一种最简单的方法&#xff0c;可以把灰度图像转换成二值图像。具体实现是将大…

云原生之深入解析K8S 1.27新特性如何简化状态服务跨集群平滑迁移

一、背景 Kubernetes v1.26 为 StatefulSet 引入了一个新的 Alpha 级别特性&#xff0c;可以控制 Pod 副本的序号。从 Kubernetes v1.27 开始&#xff0c;此特性进级到 Beta 阶段。序数可以从任意非负数开始&#xff0c; 那么该如何使用此功能呢&#xff1f;StatefulSet 序号为…

剑指 Offer(第2版)面试题 38:字符串的排列

剑指 Offer&#xff08;第2版&#xff09;面试题 38&#xff1a;字符串的排列 剑指 Offer&#xff08;第2版&#xff09;面试题 38&#xff1a;字符串的排列解法1&#xff1a;回溯扩展题一&#xff1a;LeetCode 46. 全排列扩展题二&#xff1a;LeetCode 47. 全排列 II 剑指 Off…

C# WPF上位机开发(ExtendedWPFToolkit扩展包使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 虽然个人认为当前的c# wpf内容已经足够多&#xff0c;但是肯定还是有很多个性化的需求没有满足。比如说不够好看&#xff0c;比如说动画效果不好&a…

解决ZooKeeper中/rmstore无法删除问题

无法删除znode /rmstore的原因在于yarn在注册时候候自己添加上ACL&#xff0c;导致无法直接删除。解决办法&#xff1a;重新设置ACL。 首先&#xff0c;查看ACL&#xff1a;getAcl /rmstore/ZKRMStateRoot 之后&#xff0c;重新设置ACL&#xff1a;setAcl /rmstore/ZKRMState…

【重点】【回溯】【DFS】79.单词搜索

题目 注意&#xff1a;此题跟岛屿的数量对比来看&#xff0c;增加了回溯的过程&#xff0c;岛屿题并无回溯。 法1&#xff1a;DFS 必须掌握方法&#xff01; class Solution {public boolean exist(char[][] board, String word) {char[] charArr word.toCharArray();int m…

SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?

文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里&#xff0c;MVCC的实现机制是不同的。本节我们会以InnoDB举例&#xff0c;讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念&#xff1a; 事务版本号行记录的隐藏…

任务十六:主备备份型防火墙双机热备

目录 目的 器材 拓扑 步骤 一、基本配置 配置各路由器接口的IP地址【省略】 1、配置BGP协议实现Internet路由器之间互联 2、防火墙FW1和FW2接口IP配置与区域划分 3、配置区域间转发策略 4、配置NAPT和默认路由 5、配置VRRP组&#xff0c;并加入Active/standby VGMP管…

代码随想录算法训练营第二十六天(回溯算法篇)|131. 分割回文串

131. 分割回文串 题目链接&#xff1a;131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 思路 分割字串和组合的题目有异曲同工之妙。 组合&#xff1a;选好数组中第一个数&#xff0c;接着选数组中第一个后面的数&#xff0c;进入递归。第一个树层代表选的第一个数…

Windows下配置最新ChromeDriver

1、问题 在使用代码调用谷歌浏览器时会出错&#xff1a; from selenium import webdriver driver webdriver.Chrome() SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser versi…

KSP音频抓包

1. 按照网上其他教程&#xff0c;安装KSP抓音频 Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;38&#xff09;-- KSP in MDE - 大大通(简体站) Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;22&#xff09;--DSP音频链路监听 - 大大通(简体站) <<Biu~笔记&#xff1a;高…