设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123426 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

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

postProcessAfterInitialization
postProcessBeforeInitialization
通过实现DisposableBean接口
通过配置文件指定销毁方法
通过实现InitializingBean接口
通过配置文件指定初始化方法
BeanPostProcessor接口
对象的销毁
对象的初始化
对象的创建
Publisher发送者
Listener监听者
Event事件
观察者模式中的消息类型匹配支持
支持扩展的设计模式
观察者模式和模板模式的应用
Spring Bean的创建过程
ApplicationContext作为事件总线
Spring提供的观察者模式实现
Google Guava提供的观察者模式实现
Java提供的观察者模式实现
课堂讨论
总结
模板模式在Spring中的应用
观察者模式在Spring中的应用
Spring框架中支持扩展的两种设计模式

该思维导图由 AI 生成,仅供参考

上一节课中,我们学习了 Spring 框架背后蕴藏的一些经典设计思想,比如约定优于配置、低侵入松耦合、模块化轻量级等等。我们可以将这些设计思想借鉴到其他框架开发中,在大的设计层面提高框架的代码质量。这也是我们在专栏中讲解这部分内容的原因。
除了上一节课中讲到的设计思想,实际上,可扩展也是大部分框架应该具备的一个重要特性。所谓的框架可扩展,我们之前也提到过,意思就是,框架使用者在不修改框架源码的情况下,基于扩展点定制扩展新的功能。
前面在理论部分,我们也讲到,常用来实现扩展特性的设计模式有:观察者模式、模板模式、职责链模式、策略模式等。今天,我们再剖析 Spring 框架为了支持可扩展特性用的 2 种设计模式:观察者模式和模板模式。
话不多说,让我们正式开始今天的学习吧!

观察者模式在 Spring 中的应用

在前面我们讲到,Java、Google Guava 都提供了观察者模式的实现框架。Java 提供的框架比较简单,只包含 java.util.Observable 和 java.util.Observer 两个类。Google Guava 提供的框架功能比较完善和强大:通过 EventBus 事件总线来实现观察者模式。实际上,Spring 也提供了观察者模式的实现框架。今天,我们就再来讲一讲它。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spring框架中的观察者模式和模板模式是支持扩展的设计模式。观察者模式包含Event事件、Listener监听者、Publisher发送者三部分,通过ApplicationContext实现事件的发送和监听。模板模式在Spring中用于定制Bean的创建过程,包括对象的创建和初始化。Spring还提供了Bean的销毁过程管理。在Bean的整个生命周期中,Spring通过BeanPostProcessor接口定义了初始化前置和后置操作。这些设计模式的应用体现了Spring框架的扩展性和灵活性。文章还讨论了观察者模式在Google Guava的EventBus实现中的消息类型匹配,以及对Spring提供的观察者模式的消息类型匹配的探讨。整体而言,本文深入探讨了Spring框架中观察者模式和模板模式的应用,以及相关技术细节,对于想要深入了解Spring框架设计模式的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • zz
    看到源码中有这么多的if else,瞬间给了自己一些信心。
    2020-06-05
    7
    36
  • Heaven
    看了下源码,其流程可以从 图片: https://uploader.shimo.im/f/fZuIVWFIlWQnnRFq.png 推送Event时候,去发送Event开始走 主要就是这个 在此方法中,会调用getApplicationListeners(event,eventType)函数 图片: https://uploader.shimo.im/f/3mZZvSBhmc8CXLnx.png 在这个方法中,会获取到对应的所有监听者,如何获取到的,会先通过一个锁来从一个名为retrieverCache的map中尝试获取到对应的监听者 如果拿不到,会进入到retrieveApplicationListeners()这个函数之中 图片: https://uploader.shimo.im/f/GFvS2QEKGlMctZrc.png 在这个方法中,会在add返回的结果的时候,会调用一个方法supportsEvent(), 这才是真正进行匹配的方法 图片: https://uploader.shimo.im/f/102Ia9ToqIw5ZOyq.png 匹配事件和源类型是否一致,一致才算做可以发送
    2020-05-18
    1
    10
  • 悟光
    支持按照消息类型匹配观察者,最终调用 SimpleApplicationEventMulticaster 类的multicastEvent方法通过反射匹配类型。根据配置采用异步还是同步的监听方式。 public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) { ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); Executor executor = getTaskExecutor(); for (ApplicationListener<?> listener : getApplicationListeners(event, type)) { if (executor != null) { executor.execute(() -> invokeListener(listener, event)); } else { invokeListener(listener, event); } } }
    2020-05-18
    10
  • test
    用反射获取的type
    2020-05-18
    8
  • Monday
    定义了一个bean同时实现了InitializingBean, BeanPostProcessor, DisposableBean,发现方法跟老师最后一张图的不一致: 1、顺序是构造器、afterPropertiesSet、postProcessBeforeInitialization、postProcessAfterInitialization、destroy 2、postProcessBeforeInitialization、postProcessAfterInitialization这两个方法交替执行了N次
    2020-05-20
    1
    6
  • 松小鼠
    昨天刚好在隔壁小马哥那里看到了,两个课一起听,侧重点不同,都很重要啊
    2020-05-18
    3
    5
  • Tobias
    Spring 提供的观察者模式是支持按照消息类型匹配观察者。getApplicationListeners(event, type) 方法会根据eventtype 找到对应的的listeners. getApplicationListeners(event, type) 通过反射找到 event 以及event的子类 对应的listeners.
    2020-07-27
    3
  • tonyli
    使用模板模式定义了一系列步骤的骨架,是各类框架的根本设计模式。
    2022-09-19归属地:中国香港
    2
  • 握了个大蚂蚱
    1.实现InitializingBean的初始化方法,也是约定优于配置的一个体现,只不过不是覆盖默认值而是实现init-method的一个前置方法afterPropertiesSet。 2.实现InitializingBean的初始化方法和自己指定init-method相比,侵入性更高,所以不太推荐。可以用注解版的@Bean(initMethod = "xx")来指定初始化方法,或者使用JSR250中的@PostConstruct标注在初始化方法上来让程序回调。
    2020-10-12
    1
  • 剑八
    spring中的refresh是一个模板方法: 大致有:注册beanFactoryPostProcessor,beanPostProcessor,读取bean definition,创建并初始化bean,等
    2020-07-05
    1
    1
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部