Spring的事件(Application Event)为Bean与Bean之间的信息通讯提供了支持。当一个Bean处理完一个任务之后,希望另一Bean指定并能做相应的处理,这时我们就需要让另外一个Bean监听当期Bean所发送的事件。

  通过上述基本信息可知,Spring的事件需要遵循如下流程:

    (1) 自定义事件,继承ApplicationEvent;

    (2)定义事件监听器,实现ApplicationListener;

    (3)使用容器发布事件。

  可以理解以上的流程就是Spring默认的事件生效规范。

  下面简单举例上述规范:

    1、自定义事件

      

    2、事件监听器

      

    3、事件发布

      

    4、配置

      

    5、运行

      

  测试结果如下:

    

  上例中,在事件发布和实际应用运行中都是用到了容器ApplicationContext,这是两个不同的容器其作用也不一样:前者用于事件发布,后者用于bean的装载。通过此例同时验证了spring的功能不仅仅类似装水的容器单一功能,该容器还附带其他功能。就如可以放音乐的冰箱,冰箱本身的功能是保存食物,但是不妨碍制造者制造冰箱时提供其基本功能以外的其他功能。

  此例中的其他功能Bean之间消息传递使用的Application Event是如何有效工作的呢?上述源码中没有调用事件监听类的迹象,但是实际运行结果确实打印处理监听类中的信息。这里就得从命令设计模式的角度去理解了,实际这只是个人的理解,从理论的角度严格说来具体是否是命令模式待商榷吧(个人理论水平有限)。

  其UML图如下:

    

  看似与命令模式没有关联,实际情况是此例中使用的接口都是Spring封装好的,在此图中无法体现。如果将Spring封装好的接口在UML中体现,将是怎样的呢?

     

  上图与命令模式的UML图也不尽相同。上图Event作为参数将整个UML图形成一个C型环,而命令模式通过命令接口作为一个对象实现C型环。但是为什么还是可以按照命令模式的逻辑理解呢?因为它们有个共同点:就是发布指令,与执行指令完全没有任何直接的联系。发布指令后,如果不跟踪根本不知道这个指令是怎么执行的——执行过程对外完全屏蔽。对于用户而言,只需发布指令即可,接收者或者监听者无论发生什么变化用户是不可知的;对开发者而言,如果业务发生改变,改变执行该业务接收者或监听者即可。

  跟踪发现:在Spring中,prepareBeanFactory时,处理Publisher相关内容;Listener创建时,后置处理器,处理监听器的添加;执行具体发布指令的命令时触发监听者执行相关的指令:

    

  所以,实际上Spring将指令的实际执行者封装在了容器中,而不是如通用的命令模式将Receiver封装在具体的命令中。而ApplicationContext本身就是一个publisher:

    

  即ApplicationContext进行事件发布时之前,该事件监听者已经进行了注册并与其形参一对多的关系,只待调用:

    

从命令模式的维度理解Spring 之Application Event的更多相关文章

  1. spring 事件(Application Event)

    spring 事件为bean 与 bean之间传递消息.一个bean处理完了希望其余一个接着处理.这时我们就需要其余的一个bean监听当前bean所发送的事件. spring事件使用步骤如下: 1.先 ...

  2. Head First 设计模式 --6 命令模式

    命令模式:将"请求"封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.用到的原则:1.封装变化2.组合优于继承3.针对接口编程,不能针对实现 ...

  3. Java设计模式-命令模式(Command)

    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...

  4. 命令模式(Command)

    命令模式(Command) 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互 ...

  5. 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...

  6. 设计模式学习笔记(十五)命令模式及在Spring JdbcTemplate 中的实现

    命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储.传递.调用.增加与管理. 也就是将发送者.接收者和调用命令封装成独立的对象,来供客户端调 ...

  7. Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式

    java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的 ...

  8. 深入理解JavaScript系列(34):设计模式之命令模式

    介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及执行可撤销的操作.也就是说改模式旨在将函数的调用.请求和 ...

  9. JS命令模式个人理解

    JS命令模式个人理解 //BODY部分<body> <button id="execute">打开电视</button> <button ...

随机推荐

  1. springBoot--01--快速入门

    笔记源码:https://gitee.com/ytfsL/springboot 1.1 原有Spring优缺点分析 1.1.1 Spring的优点分析 Spring是Java企业版(Java Ente ...

  2. 《剑指offer》面试题37. 序列化二叉树

    问题描述 请实现两个函数,分别用来序列化和反序列化二叉树. 示例:  你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,null,null,4,5]&quo ...

  3. 解决nRF Connect for PC无法连接网络的问题(非FQ)

    各位小伙伴是不是也遇到过国内不能正常使用nRF Connect的问题,现在教大家一个十分有效的办法. 1.找到nrf connect的脚本配置文件"apps.json",默认在&q ...

  4. Python实现自动更改系统用户密码,生成随机密码

    算是一个实用的例子,定制系统任务,并将随机密码上传至日志服务器,实现定期修改密码: 部分代码: 1 #!/usr/bin/env python 2 #coding:utf-8 3 import ran ...

  5. springmvc请求处理过程

    springmvc请求的处理流程 1)发起some.do 2)tomcat(web.xml-----url-pattern知道*.do的请求给DispatcherServlet) 3)Dispatch ...

  6. Spring系列8:bean的作用域

    本文内容 bean定义信息的意义 介绍6种bean的作用域 bean定义信息的意义 Spring中区分下类.类定义信息,类实例对象的概念?不容易理解,以餐馆中点炒饭为例. 类: 相当于你看到菜单上炒饭 ...

  7. python小兵 面向对象继承super和c3算法

    python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...

  8. jsp 中 include指令 用法, <%@ include file="..."%> 和 <jsp:include page="..." flush="true" />的区别?

    原文链接https://blog.csdn.net/u012187452/article/details/51779052 1. 什么是jsp 文件? 个人理解.  jsp 是一个容器,可以将我们编写 ...

  9. 从Apache官网下载Jar包步骤

    第一步:在官网找寻需要的包 Apache网址:http://commons.apache.org/ 在官网中,可以直接看到不同jar包的分类,如下图所示: 也可以点击官网左侧栏目里的 Release, ...

  10. TensorFlow 机器学习秘籍中文第二版·翻译完成

    原文:TensorFlow Machine Learning Cookbook 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>,生活原则 2.3 ...