为什么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 源码中各种设计模式的使用相关推荐

  1. glide源码中包含了那种设计模式_源码中的设计模式-单例模式

    jdk源码 public class Runtime { private static Runtime currentRuntime = new Runtime(); /** * Returns th ...

  2. 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现

    解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...

  3. 17.你知道哪些设计模式,它们在JDK源码中是怎么体现的

    17.你知道哪些设计模式,它们在JDK源码中是怎么体现的 参考外国文献:http://h5ip.cn/lPtD 作者:肥朝 | 微信公众号:肥朝(ID:feichao_java) 一.结构性模式: 1 ...

  4. 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用

    文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...

  5. 装饰器模式在MyBatis以及Spring源码中的应用

    结构型模式                 ----顺口溜:适装桥组享代外 目录 1.装饰器模式 1.1 装饰器模式UML图 1.2 日常生活中看装饰器模式 1.3 使用场景 1.4 Java代码实现 ...

  6. 从框架源码中学习创建型设计模式

    文章目录 从框架源码中解读创建型设计模式 工厂模式 案例一:RocketMQ源码-创建Producer生产者 案例二:RocketMQ源码-创建过滤器工厂 抽象工厂 案例一:Dubbo源码-创建缓存的 ...

  7. Spring事件机制Event源码解析(未完待续)

    Spring事件机制Event源码解析(未完待续) 监听器: ApplicationEvent事件 ApplicationListener监听器(观察者) ApplicationEventMultic ...

  8. android源码使用方法,android源码中使用到的设计模式(创建型)

    1.单例模式 1.1定义 确保某个类只有一个实例,而且自行实例化并向整个系统提供者个实例. 1.2单例的形式 饿汉模式:第一次就加载,用空间换时间. public class SingleTon { ...

  9. MyBatis学习总结(26)——Mybatis源码中使用了哪些设计模式?

    分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Myba ...

最新文章

  1. 用flex进行网易云音乐界面构建和布局解析(2)
  2. 初学python还是swift-Swift 势必取代 Python?
  3. Response.Redirect(),Server.Transfer(),Server.Execute()的区别与网站优化
  4. java restful_Java EE中的RESTful计时器
  5. SVN merge(合并) 的三种方式
  6. java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...
  7. 经典html,经典 HTML
  8. eclipse 重构功能。
  9. 为什么MyBatis配置映射器只有四种
  10. 火车头伪原创php-火车头采集伪原创插件
  11. 打开Idea,弹出Server‘s certificate is not trusted 解决方法
  12. Linux服务器下安装ANSYS
  13. matlab中dstep与step,DINT和DWORD的区别
  14. 一天一个面试题之——反射
  15. 暗影精灵5风扇怎么调_惠普HP暗影精灵5 Super游戏主机改装猫头鹰风扇攻略
  16. Chrome安装flash插件的解决方案
  17. r语言rank降序_常见排序分析方法及R语言实现
  18. CSMA/CD的基本工作过程
  19. abs传感器电压有几伏电_怎样判断abs传感器坏了 万能表测abs传感器好坏
  20. 从零开始使用Python编程DJI Tello

热门文章

  1. oracle服务器错误,oracle 11g数据库维护中错误总结
  2. 方舟原始恐惧mod生物代码_重磅!命令与征服和红色警戒源代码在GitHub公布了
  3. 计算机数学专业是应用数学专业吗,大学数学系的数学与应用数学专业学什么课程内容?...
  4. 两步操作解决Python3中openCV库安装难题(清华大学镜像源)
  5. 统计学---数据的标准化
  6. 全球及中国生物降解塑料行业应用需求前景及竞争态势研究报告2021版
  7. 外国人工作证延期、办理外国人居留许可延期
  8. 克隆 Linux系统盘,linux系统克隆系统盘
  9. 一、activiti工作流(workflow)入门介绍
  10. 【DB2】NVL2函数