85 | 开源实战四(中):剖析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
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(14)
- 最新
- 精选
- zz看到源码中有这么多的if else,瞬间给了自己一些信心。2020-06-05736
- 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-18110
- 悟光支持按照消息类型匹配观察者,最终调用 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-1810
- test用反射获取的type2020-05-188
- Monday定义了一个bean同时实现了InitializingBean, BeanPostProcessor, DisposableBean,发现方法跟老师最后一张图的不一致: 1、顺序是构造器、afterPropertiesSet、postProcessBeforeInitialization、postProcessAfterInitialization、destroy 2、postProcessBeforeInitialization、postProcessAfterInitialization这两个方法交替执行了N次2020-05-2016
- 松小鼠昨天刚好在隔壁小马哥那里看到了,两个课一起听,侧重点不同,都很重要啊2020-05-1835
- TobiasSpring 提供的观察者模式是支持按照消息类型匹配观察者。getApplicationListeners(event, type) 方法会根据eventtype 找到对应的的listeners. getApplicationListeners(event, type) 通过反射找到 event 以及event的子类 对应的listeners.2020-07-273
- tonyli使用模板模式定义了一系列步骤的骨架,是各类框架的根本设计模式。2022-09-19归属地:中国香港2
- 握了个大蚂蚱1.实现InitializingBean的初始化方法,也是约定优于配置的一个体现,只不过不是覆盖默认值而是实现init-method的一个前置方法afterPropertiesSet。 2.实现InitializingBean的初始化方法和自己指定init-method相比,侵入性更高,所以不太推荐。可以用注解版的@Bean(initMethod = "xx")来指定初始化方法,或者使用JSR250中的@PostConstruct标注在初始化方法上来让程序回调。2020-10-121
- 剑八spring中的refresh是一个模板方法: 大致有:注册beanFactoryPostProcessor,beanPostProcessor,读取bean definition,创建并初始化bean,等2020-07-0511
收起评论