您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

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

时间:2022-02-09 09:26:27  来源:  作者:Java架构海子

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框架BeanFactoryApplicationContext类使用工厂模式创建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框架中都用到了哪些设计模式?

 

  • Spring AOP集成了AspectJ,AspectJJava中最为完整的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框架中都用到了哪些设计模式?

 

  • 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关闭后触发的事件
Spring框架中都用到了哪些设计模式?

 

事件监听者角色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() 方法
  • 使用事件发布者发布消息: 使用ApplicationEventPublisherpublishEvent() 方法 重写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的类



Tags:框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Spring控制反转IOC 控制反转IOC: Inversion of Control 是一种解耦设计原则 主要目的是借助第三方,比如Spring IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间...【详细内容】
2022-02-09  Tags: 框架  点击:(3)  评论:(0)  加入收藏
GO 语言爱好者的最佳Web框架如果你是自己写一个小应用程序,那你可能不需要Web框架。但是如果你要做产品,那么你肯定需要一个好的框架。如果你认为你有相应的知识和经验,你会自...【详细内容】
2022-02-01  Tags: 框架  点击:(14)  评论:(0)  加入收藏
总结报告工作总结思路如下:一、工作业绩1.取得了哪些成绩2.完成了哪些工作3.当前实际进度4.计划实施情况二、工作亮点以及经验1.哪些方面提高了效率2.优化了哪些流程3.节约了...【详细内容】
2022-01-26  Tags: 框架  点击:(7)  评论:(0)  加入收藏
Php是不是彻底凉了?我相信有很多人是图着这句话来的,虽然一直不明白那群人为什么要唱衰php,实在是没搞定深层次的利益关系,不过本文不是探讨此问题的,本文为伊凡向一颗优雅草科技...【详细内容】
2022-01-24  Tags: 框架  点击:(18)  评论:(0)  加入收藏
首先建议大家去做a+,就是去做品牌备案,或者说找服务商,在长描述的地方去做图文版的描述,就是做a+页面,因为a+页面,是可以做图片的,图片更加直观、有效去展示我们的产品。那如果说你...【详细内容】
2022-01-21  Tags: 框架  点击:(20)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个用 Python 编写的开源 UI 框架&mdash;&mdash;kiv...【详细内容】
2022-01-10  Tags: 框架  点击:(35)  评论:(0)  加入收藏
Apache Dubbo 3.0.5 已发布,这是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。此版本...【详细内容】
2022-01-07  Tags: 框架  点击:(30)  评论:(0)  加入收藏
byview 是一个自己开发的,用于引导vue组件直接工作在浏览器中而不需要脚手架的一个微框架(启动引擎),使得vue在浏览器中开发体验跟vue-cli相似。无需独立编译资源文件,修改立...【详细内容】
2021-12-30  Tags: 框架  点击:(40)  评论:(0)  加入收藏
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Tags: 框架  点击:(53)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  Tags: 框架  点击:(47)  评论:(0)  加入收藏
▌简易百科推荐
今天TJ君要给大家分享的是一款Mybatis界面工具,可以方便生成Mybatis的相关代码。mybatis-generator-guimybatis-generator-gui,是一款基于mybatis-generator开发的界面工具,目...【详细内容】
2022-02-10  码农看看    Tags:MyBatis   点击:(4)  评论:(0)  加入收藏
最近看同事的代码时候,学到了个小技巧,在某些场景下非常挺有用的,这里分享一下给大家。 Spring 中 @Autowired注解,大家应该不会陌生,用过 Spring 的肯定也离不开这个注解,通过这...【详细内容】
2022-02-09  DNF搬砖摸金达人    Tags:Spring   点击:(3)  评论:(0)  加入收藏
Spring控制反转IOC 控制反转IOC: Inversion of Control 是一种解耦设计原则 主要目的是借助第三方,比如Spring IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间...【详细内容】
2022-02-09  Java架构海子    Tags:框架   点击:(3)  评论:(0)  加入收藏
GO 语言爱好者的最佳Web框架如果你是自己写一个小应用程序,那你可能不需要Web框架。但是如果你要做产品,那么你肯定需要一个好的框架。如果你认为你有相应的知识和经验,你会自...【详细内容】
2022-02-01  杨同学编程    Tags:Web框架   点击:(14)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个用 Python 编写的开源 UI 框架&mdash;&mdash;kiv...【详细内容】
2022-01-10  GitHub精选    Tags:UI 框架   点击:(35)  评论:(0)  加入收藏
Apache Dubbo 3.0.5 已发布,这是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。此版本...【详细内容】
2022-01-07  BAT架构    Tags:框架   点击:(30)  评论:(0)  加入收藏
微信支付API-V3和V2的区别微信支付API-V3和之前V2版本最大的区别,应该就是加密方式的改变了。新版的支付接口,全部使用是SSL双向加密。就是指微信服务器端、商户端各自都有一...【详细内容】
2021-12-29  666Tec    Tags:Springboot   点击:(30)  评论:(0)  加入收藏
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(53)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(47)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(34)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条