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

Spring 框架中都用到了哪些设计模式? Spring框架中的设计模式是多种多样的,它们共同构成了Spring强大的功能和灵活性。学习和理解这些设计模式不仅有助于我们更好地使用Spring框架,也有助于我们提高软件设计和开发的能力。Spring框架运用多种设计模式,如工厂、单例、代理、模板方法、观察者、策略和适配器等,实现其强大的功能和灵活性。这些设计模式使得Spring更加易于扩展和使用,同时也为学习和实践设计模式提供了机会。 阅读详情

Spring

控制反转IOC

  • 控制反转IOC: Inversion of Control 是一种解耦设计原则 主要目的是借助第三方,比如Spring IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间的耦合度
  • Spring IOC容器: Spring IOC容器负责创建对象并将对象连接在一起,配置这些对象.从创建中处理这些对象的整个生命周期,直到对象被完全销毁 Spring IOC容器类似一个工厂 在创建对象时,只需要配置好配置文件或者是注解即可,不需要关注对象是如何创建的
  • 控制反转示例: 对象a依赖于对象b, 当对象a需要使用对象b时必须由对象a创建对象b的实例 引入IOC容器后,当对象a需要使用对象b时,可以指定IOC容器去创建一个对象b注入到对象a中 引入IOC容器之后,对象a获取对象b的过程,由主动行为变为被动行为
  • 实现了IOC原则的设计模式: 服务定位器模式ServiceLocator 工厂模式Factory 抽象工厂模式AbstractFactory 模板方法模式TemplateMethod 策略模式Strategy 依赖注入Depedency Inject

依赖注入DI

  • 依赖注入DI: Dependency Inject 将实例变量传入到一个对象中去 是实现控制反转的一种设计模式

工厂设计模式Factory

  • Spring框架中BeanFactory和ApplicationContext类使用工厂模式创建Bean对象

BeanFactory

  • 延迟注入,即使用到某个Bean时才会进行注入
  • 和ApplicationContext相比会占用更少的内存,程序启动速度更快

ApplicationContext

  • 容器启动时就创建所有的Bean
  • 和BeanFactory相比 ,BeanFactory仅提供了最基本的依赖注入支持 . ApplicationContext扩展了BeanFactory, 除了BeanFactory的功能外还包含其余更多的功能,通常使用ApplicationContext创建Bean
  • ApplicationContext的三个实现类: ClassPathXmlApplication: 将上下文文件作为类路径资源 FileSystemXmlApplication: 从文件系统中的XML文件中载入上下文定义信息 XmlWebApplicationContext: 从Web系统中的XML文件中载入上下文定义信息

单例设计模式Singleton

  • Spring中的Bean的作用域默认就是单例Singleton的 . Spring中的Bean还可以定义以下作用域: prototype: 每次请求都会创建一个新的Bean实例 request: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP request中有效 session: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP session中有效
  • Spring实现单例Bean的方式: xml的方式: <bean id="bean" class="com.oxford.Bean" scope="singleton"/> 复制代码 注解的方式: @Scope(value="singleton") 复制代码
  • Spring底层通过ConcurrentHashMap实现单例注册表来实现单例模式:
// 通过线程安全的concurrentHashMap实现单例注册表
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
	Assert.notNull(beanName, "'beanName' must not be null");
	synchronized(this.singletonObjects) {
		// 检查缓存中是否存在实例
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null) {
			...
			try {
				singleton = singletonFactory.getObject();
			}
			...
			// 如果实例对象不存在,则将对象注册到单例注册表中
			addSingleton(beanName, singletonObject);
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}
}

protected void addSingleton(String beanName, Object singletonObject) {
	synchronized(this.singletonObjects) {
		this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
	}
}
复制代码

代理设计模式Proxy

AOP中的代理模式

  • 面向切面编程AOP: Aspect-Oriented Programming 面向切面编程能够将和业务无关,但是是业务模块中所共同调用的逻辑或者业务功能封装起来, 比如事务管理,日志管理,权限控制等 有利于减少重复代码,降低模块之间的耦合度,并有利于面向未来的可拓展性和可维护性 使用AOP可以将一些通用功能抽象出来,在需要使用的地方直接使用,这样可以大大简化代码量 需要增加新功能也会更加简单方便,这样可以提高系统的扩展性
  • Spring AOP基于动态代理实现的: 代理对象实现了接口: Spring AOP会使用Java动态代理JDK Proxy创建代理对象 完成对象的代理操作 代理对象没有实现接口: Spring AOP会使用Cglib Proxy生成一个被代理对象的子类作为代理类完成对象的代理操作

  • Spring AOP集成了AspectJ,AspectJ是Java中最为完整的AOP框架

AspectJ和Spring AOP比较

AspectJ

  • AspectJ是编译时增强
  • AspectJ基于字节码操作Bytecode Manipluation实现
  • AspectJ在切面较多的情况下要比Spring AOP的性能强很多

Spring AOP

  • Spring AOP是运行时增强
  • Spring AOP基于代理Proxy实现
  • Spring AOP中集成了AspectJ
  • Spring AOP比较简单,在切面比较少的情况下和AspectJ的性能相似

模板方法模式TemplateMethod

  • 模板方法模式: 是一种行为型模式,基于继承的代码复用 定义一个操作的算法骨架,将一些实现步骤延迟到子类中 模板方法使得子类可以不改变一个算法结构的情况下即可重新定义算法的某些特定步骤的实现方式

  • Spring中以Template结尾的类,比如jdbcTemplate等,都是使用了模板方法模式 通常情况下,都是使用继承来实现模板模式 在Spring中,使用了Callback与模板方法相结合的方式,既达到了代码复用的效果,又增加了系统的灵活性

观察者模式Observer

  • 观察者模式: 是一种对象行为模式 表示的是一种对象和对象之间具有依赖关系,当一个对象发生改变,依赖于这个对象的对象也会发生改变
  • Spring事件驱动模型就是基于观察者模式实现的 Spring事件驱动模型可以在很多应用场景中解耦代码 比如每次添加商品时都需要更新商品索引,这时就可以使用观察者模式

Spring事件驱动模型

  • Spring事件驱动模型包含三种角色: 事件Event角色 事件监听者Listener角色 事件发布者Publisher角色

事件角色Event

  • ApplicationEvent: org.springframework.context 事件角色抽象类 继承java.util.Event并实现了java.io.Serializable接口
  • Spring中默认存在以下事件,都是继承自ApplicationContext事件角色抽象类: ContextStartedEvent: ApplicationContext启动后触发的事件 ContextStoppedEvent: ApplicationContext停止后触发的事件 ContextRefreshedEvent: ApplicationContext初始化或者刷新后触发的事件 ContextClosedEvent: ApplicationContext关闭后触发的事件

事件监听者角色Listener

  • ApplicationListener: 事件监听者角色 ApplicationListener接口中定义了一个onApplicationEvent() 方法来处理ApplicationEvent. 只要实现onApplicationEvent() 方法即可完成监听事件
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
	void onApplicationEvent(E event);
}
复制代码

事件发布者角色Publisher

  • ApplicationEventPublisher: 事件发布者角色 ApplicationEventPublisher接口中定义了publishEvent() 方法来发布事件,这个方法在AbstractApplicationContext中实现 在AbstractApplicationContext中,事件是通过ApplicationEventMulticaster广播的
@FunctionalInterface
public interface ApplicationEventPublisher {
	default void publishEvent(ApplicationEvent event) {
		publishEvent((Object) event);
	}

	void publishEvent(Object event);
}
复制代码

Spring事件流程

  • 定义一个事件: 实现一个继承自ApplicationEvent的事件类,并写出相应的构造函数
  • 定义一个事件监听者: 实现ApplicationListener接口 重写onApplicationEvent() 方法
  • 使用事件发布者发布消息: 使用ApplicationEventPublisher的publishEvent() 方法 重写publishEvent() 方法发布消息
  • Spring事件模型示例

适配器模式Adapter

  • 适配器模式: 是结构型模式,也是各种结构型模式的起源 将一个接口转换为调用方需要的接口 适配器使得接口不兼容的类之间可以一起工作.适配器又被称为包装器Wrapper

Spring AOP中的适配器模式

  • Spring AOP中的增强和通知Advice使用了适配器模式,接口是AdvisorAdapter
  • 常用的Advice类型包括: BeforeAdvice: 前置通知. 目标方法调用前增强 AfterAdvice: 后置通知. 目标方法调用后增强 AfterReturningAdvice: 目标方法执行结束之后 ,return之前
  • 每个通知Advice都有对应的拦截器: BeforeAdvice - MethodBeforeAdviceInterceptor AfterAdvice - MethodAfterAdviceInterceptor AfterReturningAdvice - MethodAfterReturningAdviceInterceptor
  • Spring中预定义的通知要通过对应的适配器,适配成为MethodInterceptor接口类型的对象

Spring MVC中的适配器模式

  • Spring MVC中 ,DispatchServlet根据请求信息调用HanlderMapping, 解析请求对应的Handler, 解析到对应的Handler后,开始由HandlerAdapter适配器进行处理
  • HandlerAdapter作为期望接口,具体的适配器实现类对具体目标类进行适配 .controller作为需要适配的类
  • 通过使用适配器AdapterHandler可以对Spring MVC中众多类型的Controller通过不同的方法对请求进行处理

装饰器模式Decorator

  • 装饰器模式: 动态地给对象添加一些额外的属性或者行为 和继承相比,装饰器模式更加灵活
  • 装饰器模式使用场景: 当需要修改原有的功能,但是不想直接修改原有的代码,就可以设计一个装饰器Decorator类在原有的代码的外面,这样可以在不修改原有的类的基础上扩展新的功能
  • Spring中配置DataSource时 ,DataSource可以是不同的数据库和数据源.为了在少修改原有类的代码下动态切换不同的数据源,这时就用到了装饰器模式
  • Spring中含有Wrapper和含有Decorator的类都用到了装时期模式,都是动态地给一个对象添加一些额外的属性或者功能

总结

  • Spring框架中使用的设计模式:

设计模式

Spring框架

工厂模式

BeanFactory
ApplicationContext

单例模式

Spring中的Bean

代理模式

Spring AOP

模板方法模式

Spring中以Template结尾的类

观察者模式

Spring事件驱动模型

适配器模式

Spring AOP中的AdvisorAdapter
Spring MVC中的HandlerAdapter

装饰器模式

Spring中含有Wrapper和含有Decorator的类

【QT】基于QSerialPort的跨平台串口通信实战指南 本文是一份基于Qt QSerialPort模块的跨平台串口通信实战指南。详细介绍了从硬件基础、QSerialPort核心类使用、参数配置、设备自动发现到数据异步读写和错误处理的完整流程,并通过构建一个功能齐全的串口调试助手实例,帮助开发者快速掌握在Windows、Linux和macOS系统下进行高效、稳定的串口应用开发。 阅读详情

相关推荐

【Origin+Python】使用External Python批量出图代码参考2

不使用part2 的代码,自己打开一个origin2022的界面。这里主要介绍一些进阶代码以及使用盗版origin要如何。3 批量绘制相同设置的曲线图。然后就是没有水印的图片了。

zeng001201的博客 1908

Spring框架中都用到了哪些设计模式?详细解析设计模式在Spring框架中的应用

设计模式Spring框架工厂模式单例模式Spring中的Bean代理模式Spring AOP模板方法模式Spring中以Template结尾的类观察者模式Spring事件驱动模型适配器模式Spring AOP中的AdvisorAdapterSpring MVC中的HandlerAdapter装饰器模式Spring中含有Wrapper和含有Decorator的类作者:攻城狮Chova。

2301_76607156的博客 236

ESP-CSI:使用ESP32进行CSI(信道状态信息)采集

使用esp32进行csi(信道状态信息)采集和处理

capsize的博客 8285

面试官:Spring中用了哪些设计模式?

前言 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范。 好了,话不多说,开始今天的内容。spring中常用的设计模式达到九种,我们举例说明。 以后再也不怕面试官问我:Spring中用了哪些设计模式了。 1简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,

weixin_47067712的博客 390

1.2 固态变压器:传统工频变压器的局限与SST的技术起源

本小节明确传统工频变压器在电力系统中的基础定位与核心工作特性,系统分析其在新型电力系统场景下的固有技术瓶颈,梳理固态变压器(Solid State Transformer, SST,又称电力电子变压器Power Electronic Transformer, PET)从概念提出到工程化成熟的完整演进路径,为后续SST技术优势、设计需求与规范符合性要求的讲解建立底层逻辑,同时对应GB/T 40429-2021《电力电子变压器通用技术要求》的需求制定背景。

技术工作者 660

蓝牙Mesh安全机制全解析:如何防止你的智能门锁被黑客控制?

本文深入解析蓝牙Mesh安全机制,重点探讨如何保护智能门锁免受黑客攻击。详细介绍了蓝牙Mesh的多层次安全架构,包括密钥管理体系、设备入网流程及实战防护策略,帮助用户构建更安全的智能家居网络。

h3i4j的博客 732

九种设计模式在Spring中的应用

Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质: 由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 实现原理: bean容器的启动阶段...

拈花的专栏 1201

宏基因组分析|完整分析流程梳理

今天先从最基础的全流程框架说起,无论是刚接触的萌新,还是想查漏补缺的同行,都能找到有用的信息。

weixin_70911870的博客 3166

面试官:“谈谈Spring中都用到了那些设计模式?”。

我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 41k+ Star。会一直完善下去,欢迎建议和指导,同时也欢迎Star: github.com/Snailclimb/… JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见。我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远。所以,花了几天...

weixin_33863087的博客 5650

Oracle EBS Interface/API(42) -AP发票客制化付款申请

背景 在OA系统上,选择Oracle EBS的某张AP发票做付款申请,需要类似于锁定该发票以便付款,其他用户或者下次用户不能再次选择该发票做付款申请。 快速参考 参考点 内容 功能导航 N: AP->Invoices->Entry>Invoices 并发请求 None 基表 AP.AP_INV_SELECTION_CRITERIA_ALLAP.AP_SELECTED_INVOICES_ALL API 参考下面介绍 错误信息表 None 接口Form

陈显平的专栏-Oracle EBS 1200

RK3588S之CPU--benchmark(一)

本章会基于RK3588S来介绍有关CPU常用的benchmark工具及测试过程

文艺小少年的博客 1500

Spring框架中含有的设计模式有哪些?

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。(菜鸟教程)简单来讲,就是有一个类的工厂,工厂里面专门生产类的方法,有了这个工厂后,我们就可以直接去工厂获取类,而不是自己创建。例子:(3条消息) Spring中常见的设计模式—工厂模式_spring工厂模式_守夜人爱吃兔子的博客-优快云博客单例模式(Sing

weixin_59270599的博客 799

【C#程序员入门AI】必知的一些知识

2026年C#调用AI,核心就4个概念+3种方式4个概念:大模型(大脑)、嵌入(数字密码)、向量(载体)、Agent(超级助理)3种方式:云端API(快)、本地模型(隐私)、混合部署(最佳)不用怕复杂,跟着这个思路走,你就能从“AI小白”变成“C# AI开发能手”,把AI集成到你的.NET项目里,提升效率、创造价值!

人工智能AI技术 410

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

Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较多。 单例模式—在spring配置文件中定义的bean默认为单例模式。 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。 前端控制器—Spring提供了Di...

段远山 2105

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

作用:定义了一种一对多的依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。- 作用:将一个类的接口转换成另一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。- 作用:通过代理对象来控制对真实对象的访问,通常用于添加额外的功能,如事务管理、日志记录等。- 应用场景:AOP 中的增强功能,如 @Transactional 注解的实现。- 作用:动态地给一个对象添加一些额外的职责,而不必修改原有的代码结构。

liangyongyx的专栏 350

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

前言: spring用了哪些代理模式, 这个可以引出设计模式。 1.工厂模式 BeanFactory就是简单工厂模式的体现,用来创建对象的实例; import java.util.ResourceBundle; /** * 使用此工厂类创建bean实例 */ public class BeanFactory { //加载配置文件 private static Re...

新一的技术笔记 503

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring 框架中都用到的设计模式

Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较多。单例模式—在spring配置文件中定义的bean默认为单例模式。模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。前端控制器—Srping提供了DispatcherServlet来对请求进行分发。视图帮

atarik@163.com 4890
上一篇: 关于equals()方法,jdk源码给出如下五点建议,你知道哪些?
下一篇: Redis 很屌,不懂使用规范就糟蹋了
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值