设计模式_spring框架中常用的8种设计模式

这篇具有很好参考价值的文章主要介绍了设计模式_spring框架中常用的8种设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

spring框架中常用到的8种设计模式清单如下:

设计模式

使用地方

备注

工厂模式

BeanFactory
ApplicationContext

单例模式

Spring中的Bean

代理模式

Spring AOP

java反射实现动态代理

模板方法模式

Spring中以Template结尾的类

使用继承的方式实现

观察者模式

Spring事件驱动模型

适配器模式

Spring AOP中的AdvisorAdapter
Spring MVC中的HandlerAdapter

装饰器模式

Spring中含有Wrapper和含有Decorator的类

策略模式

资源访问Resource接口

一、工厂模式

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

1BeanFactory

是一种懒汉模式,即使用到某个Bean时才会进行注入和ApplicationContext相比会占用更少的内存,程序启动速度更快

2ApplicationContext

是一种恶汉模式,容器启动时就创建所有的Bean和BeanFactory相比 ,BeanFactory仅提供了最基本的依赖注入支持 . ApplicationContext扩展了BeanFactory, 除了BeanFactory的功能外还包含其余更多的功能,通常使用ApplicationContext创建BeanApplicationContext的三个实现类: ClassPathXmlApplication: 将上下文文件作为类路径资源

FileSystemXmlApplication: 从文件系统中的XML文件中载入上下文定义信息

XmlWebApplicationContext: 从Web系统中的XML文件中载入上下文定义信息

二、单例模式

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实现单例注册表来实现单例模式:

Java
// 通过线程安全的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));
        }
}

三、代理模式

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

Spring AOP基于动态代理实现的: 代理对象实现了接口: Spring AOP会使用Java动态代理JDK Proxy创建代理对象 完成对象的代理操作 代理对象没有实现接口: Spring AOP会使用Cglib Proxy生成一个被代理对象的子类作为代理类完成对象的代理操作

设计模式_spring框架中常用的8种设计模式

Spring AOP集成了AspectJ,AspectJJava中最为完整的AOP框架

AspectJSpring AOP比较

AspectJ

AspectJ是编译时增强

AspectJ基于字节码操作Bytecode Manipluation实现

AspectJ在切面较多的情况下要比Spring AOP的性能强很多

Spring AOP

Spring AOP是运行时增强

Spring AOP基于代理Proxy实现

Spring AOP中集成了AspectJ

Spring AOP比较简单,在切面比较少的情况下和AspectJ的性能相似

四、模板模式

  • 模板方法模式: 是一种行为型模式,基于继承的代码复用 定义一个操作的算法骨架,将一些实现步骤延迟到子类中 模板方法使得子类可以不改变一个算法结构的情况下即可重新定义算法的某些特定步骤的实现方式
  • Spring中以Template结尾的类,比如jdbcTemplate等,都是使用了模板方法模式 通常情况下,都是使用继承来实现模板模式 在Spring中,使用了Callback与模板方法相结合的方式,既达到了代码复用的效果,又增加了系统的灵活性

设计模式_spring框架中常用的8种设计模式

五、观察者模式

观察者模式: 是一种对象行为模式 表示的是一种对象和对象之间具有依赖关系,当一个对象发生改变,依赖于这个对象的对象也会发生改变

Spring事件驱动模型就是基于观察者模式实现的 Spring事件驱动模型可以在很多应用场景中解耦代码 比如每次添加商品时都需要更新商品索引,这时就可以使用观察者模式

Spring事件驱动模型

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

Spring事件流程

1、定义一个事件: 实现一个继承自ApplicationEvent的事件类,并写出相应的构造函数

2、定义一个事件监听者: 实现ApplicationListener接口 重写onApplicationEvent() 方法

3、使用事件发布者发布消息: 使用ApplicationEventPublisher的publishEvent() 方法 重写publishEvent() 方法发布消息

事件角色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() 方法即可完成监听事件

事件发布者角色Publisher

ApplicationEventPublisher: 事件发布者角色 ApplicationEventPublisher接口中定义了publishEvent() 方法来发布事件,这个方法在AbstractApplicationContext中实现 在AbstractApplicationContext中,事件是通过ApplicationEventMulticaster广播的

六、适配器模式

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

Spring AOP中的适配器模式

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

Spring MVC中的适配器模式文章来源地址https://www.toymoban.com/news/detail-401856.html

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

七、装饰器模式

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

八、策略模式

  • 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
  • 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法
  • Spring框架的资源访问Resource接口。该接口提供了更强的资源访问能力,Spring 框架本身大量使用了 Resource 接口来访问底层资源。

到了这里,关于设计模式_spring框架中常用的8种设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【开源与项目实战:开源实战】85 | 开源实战四(中):剖析Spring框架中用来支持扩展的两种设计模式

    上一节课中,我们学习了 Spring 框架背后蕴藏的一些经典设计思想,比如约定优于配置、低侵入松耦合、模块化轻量级等等。我们可以将这些设计思想借鉴到其他框架开发中,在大的设计层面提高框架的代码质量。这也是我们在专栏中讲解这部分内容的原因。 除了上一节课中

    2024年02月11日
    浏览(49)
  • 【设计模式】单例模式|最常用的设计模式

    单例模式是最常用的设计模式之一,虽然简单,但是还是有一些小坑点需要注意。本文介绍单例模式并使用go语言实现一遍单例模式。 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 使用场景: 当类只能有一个实例而且可以从一个公开的众所周知的访

    2024年04月29日
    浏览(42)
  • 小白初探架构模式—常用的设计模式

    目录 1.前言 2. 主从架构         2.1 主从架构的优点        2.2 主从架构的应用场景         2.3 主从架构的实现         2.4 主从架构的示例 3. 主从架构设计的延伸         3.1 主备模式         3.2  主从复制         3.3 集群分片         3.4 异地多活 4. 总

    2024年01月25日
    浏览(38)
  • 什么是设计模式?常用的设计有哪些?

    单例模式 工厂模式 代理模式(proxy) 设计模式是前辈们经过无数次实践所总结的一些方法(针对特定问题的特定方法) 这些设计模式中的方法都是经过反复使用过的。 1、单例模式(懒汉式、饿汉式) 步骤: 1、构造方法私有化,让除了自己类能创建,其他类都不能创建。

    2024年02月13日
    浏览(41)
  • 【常用设计模式】待补充

    Github仓库地址 23中设计模型分为常见的三大类:创建型模式、结构型模式和行为型模式 描述 简单工厂模式不是23中设计模式中的。简单工厂模式不直接向客户端暴露对象创建的细节,而是通过一个工厂类来负责创建产品类的实例 角色 抽象产品角色:给具体产品角色提供接口

    2024年02月08日
    浏览(47)
  • 前端常用的设计模式

    设计模式:是一种抽象的编程思想,并不局限于某一特定的编程语言,而是在许多语言之间是相通的;它是软件设计中常见的问题的通用、可反复使用、多少人知晓的一种解决方案或者模板。一般对与从事过面向对象编程的人来说会更熟悉一些。 设计模式的意义:指导我们如

    2024年01月24日
    浏览(35)
  • 前端常用设计模式

    在上述案例中, UserInfoComponent 负责两个职责:显示用户信息和发送请求获取用户信息。如果我们将发送请求的逻辑提取到一个单独的服务或钩子函数中,可以更好地遵守单一职责原则。 在上述案例中,主题切换功能违反了开放封闭原则,因为每次添加新的主题都需要修改切

    2024年02月10日
    浏览(37)
  • 常用设计模式

    游戏开发中常用的设计模式有很多种,以下是一些常见的设计模式: 1. 单例模式(Singleton Pattern):用于创建一个全局唯一的对象实例,比如游戏中的资源管理器或者游戏设置。 2. 工厂模式(Factory Pattern):用于创建对象的过程抽象,可以根据参数的不同返回不同类型的对象

    2024年02月09日
    浏览(38)
  • 常用的设计模式

    游戏开发中常用的设计模式有很多种,以下是一些常见的设计模式: 1. 单例模式(Singleton Pattern):用于创建一个全局唯一的对象实例,比如游戏中的资源管理器或者游戏设置。 2. 工厂模式(Factory Pattern):用于创建对象的过程抽象,可以根据参数的不同返回不同类型的对象

    2024年02月09日
    浏览(36)
  • 前端常用设计模式初探

    设计模式一直是程序员谈论的“高端”话题之一,总有一种敬而远之的心态。在了解后才知道在将函数作为一等对象的语言中,有许多需要利用对象多态性的设计模式,比如单例模式、 策略模式等,这些模式的结构与传统面向对象语言的结构大相径庭,实际上已经融入到了语

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包