找找 Spring Event 源码中各种设计模式的使用
为什么80%的码农都做不了架构师?>>>
本文将按照Spring Event 是什么鬼的思路寻找 Spring 源码中与 Spring Event 有关的设计模式实现
初始化-工厂模式
AbstractApplicationContext.java
/*** Initialize the ApplicationEventMulticaster.* Uses SimpleApplicationEventMulticaster if none defined in the context.* @see org.springframework.context.event.SimpleApplicationEventMulticaster*/
protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);if (logger.isDebugEnabled()) {logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");}}else {this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);if (logger.isDebugEnabled()) {logger.debug("Unable to locate ApplicationEventMulticaster with name '" +APPLICATION_EVENT_MULTICASTER_BEAN_NAME +"': using default [" + this.applicationEventMulticaster + "]");}}
}
Mulicater的创建过程就是通过bean 工厂创建,此处使用了工厂模式,BeanFactory 接口定义了 getBean 方法,AbstractBeanFactory 实现了getBean方法,而针对 Bean 的管理( Bean的定义、Bean的创建以及对Bean的解析)AbstractXXXBeanFactory等抽象类来管理,不同的抽象类有不同的管理策略。
事件发布-观察者模式
//AbstractApplicationEventMulticaster.javapublic void multicastEvent(final ApplicationEvent event) {for (final ApplicationListener listener : getApplicationListeners(event)) {Executor executor = getTaskExecutor();if (executor != null) {executor.execute(new Runnable() {public void run() {listener.onApplicationEvent(event);}});}else {listener.onApplicationEvent(event);}}}
根据 event,找到监听的 listener,在事件触发时,调用 listener 的 onApplicationEvent(event) 方法,此处观察者模式的运用得益于 ApplicationEvent ApplicationListener 两个接口的定义,Spring 通过 Listener 的监听方法参数与实际触发的事件对象匹配来区别是否应该调用Listener的 onApplicationEvent 方法。
转载于:https://my.oschina.net/mays/blog/656187
找找 Spring Event 源码中各种设计模式的使用相关推荐
- glide源码中包含了那种设计模式_源码中的设计模式-单例模式
jdk源码 public class Runtime { private static Runtime currentRuntime = new Runtime(); /** * Returns th ...
- 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现
解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...
- 17.你知道哪些设计模式,它们在JDK源码中是怎么体现的
17.你知道哪些设计模式,它们在JDK源码中是怎么体现的 参考外国文献:http://h5ip.cn/lPtD 作者:肥朝 | 微信公众号:肥朝(ID:feichao_java) 一.结构性模式: 1 ...
- 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用
文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...
- 装饰器模式在MyBatis以及Spring源码中的应用
结构型模式 ----顺口溜:适装桥组享代外 目录 1.装饰器模式 1.1 装饰器模式UML图 1.2 日常生活中看装饰器模式 1.3 使用场景 1.4 Java代码实现 ...
- 从框架源码中学习创建型设计模式
文章目录 从框架源码中解读创建型设计模式 工厂模式 案例一:RocketMQ源码-创建Producer生产者 案例二:RocketMQ源码-创建过滤器工厂 抽象工厂 案例一:Dubbo源码-创建缓存的 ...
- Spring事件机制Event源码解析(未完待续)
Spring事件机制Event源码解析(未完待续) 监听器: ApplicationEvent事件 ApplicationListener监听器(观察者) ApplicationEventMultic ...
- android源码使用方法,android源码中使用到的设计模式(创建型)
1.单例模式 1.1定义 确保某个类只有一个实例,而且自行实例化并向整个系统提供者个实例. 1.2单例的形式 饿汉模式:第一次就加载,用空间换时间. public class SingleTon { ...
- MyBatis学习总结(26)——Mybatis源码中使用了哪些设计模式?
分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Myba ...
最新文章
- 用flex进行网易云音乐界面构建和布局解析(2)
- 初学python还是swift-Swift 势必取代 Python?
- Response.Redirect(),Server.Transfer(),Server.Execute()的区别与网站优化
- java restful_Java EE中的RESTful计时器
- SVN merge(合并) 的三种方式
- java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...
- 经典html,经典 HTML
- eclipse 重构功能。
- 为什么MyBatis配置映射器只有四种
- 火车头伪原创php-火车头采集伪原创插件
- 打开Idea,弹出Server‘s certificate is not trusted 解决方法
- Linux服务器下安装ANSYS
- matlab中dstep与step,DINT和DWORD的区别
- 一天一个面试题之——反射
- 暗影精灵5风扇怎么调_惠普HP暗影精灵5 Super游戏主机改装猫头鹰风扇攻略
- Chrome安装flash插件的解决方案
- r语言rank降序_常见排序分析方法及R语言实现
- CSMA/CD的基本工作过程
- abs传感器电压有几伏电_怎样判断abs传感器坏了 万能表测abs传感器好坏
- 从零开始使用Python编程DJI Tello
热门文章
- oracle服务器错误,oracle 11g数据库维护中错误总结
- 方舟原始恐惧mod生物代码_重磅!命令与征服和红色警戒源代码在GitHub公布了
- 计算机数学专业是应用数学专业吗,大学数学系的数学与应用数学专业学什么课程内容?...
- 两步操作解决Python3中openCV库安装难题(清华大学镜像源)
- 统计学---数据的标准化
- 全球及中国生物降解塑料行业应用需求前景及竞争态势研究报告2021版
- 外国人工作证延期、办理外国人居留许可延期
- 克隆 Linux系统盘,linux系统克隆系统盘
- 一、activiti工作流(workflow)入门介绍
- 【DB2】NVL2函数