ddsspring中的事件机制使用到设计模式中的观察者模式 ,观察者模式有两个概念,1.观察者、被观察者。2.被观察者做出相应得动作,观察者能接收到。不分析设计模式,学习下spring中的事件机制实际开发如何使用 及使用场景 。

spring中的事件机制涉及到者几个类文件 :ApplicationEvent(事件类型)、ApplicationListener(事件监听类)、ApplicationEventPublisher(事件发布类)。先看看这几个类的继承、实现关系:

Application类继承jdk Utill包中的 EventObject,下面实现了很多子类:

ApplicationListener :接口继承了utill 包中的EventListener接口,泛型参数E必须继承ApplicationEvent类

ApplicationEventPublisher: 事件发布接口 ,实现类很多,其中子类ApplicationContext,发布事件就用ApplicationContext类去发布 

使用方法:

  1.声明事件类型

public class DemoEvent extends ApplicationEvent{
private static final long serialVersionUID = 1L; public DemoEvent(Object source) {
super(source);
} }

2.事件监听类

@Component  // 注意这里要把类注册到spring容器中
public class DemoListener implements ApplicationListener<DemoEvent> {//1
@Override
public void onApplicationEvent(DemoEvent event) {//2
Object o = event.getSource();
System.out.println("我(bean-demoListener)接收到了bean-demoPublisher发布的消息:"+ o); } }

3.配置类

@Configuration
@ComponentScan("springboot.springboot_learn.event") //扫描加载bean文件
public class EventConfig { }

4.事件发布 ,使用AnnotationConfigApplicationContext 类,这个为ApplicationContext的子类

public class Client {
public static void main(String[] args) throws InterruptedException {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(EventConfig.class); context.publishEvent(new DemoEvent("我要发财")); }
}

实际开发中使用场景 :提交一个订单order,成功后给用户发送短信,大多时候我们会写类似一下代码

public String submitOrder(OrderInfo orderinfo){
... // 省略代码
String rsMassage = dao.add(orderinfo);//插入信息
Boolean flag = sendSms(rsMassage); //发送短信
return flag ; //返回是否成功
}

这个代码一看是没有毛病。但是如果后续老板叫你,发送成功后还要给用户发个微信,还要给用户发个QQ...?,那么就要往submitOrder方法继续的添加代码,根据代码的开闭原则,这并不是最好的做法。那么可以做到,不修改代码,做到添加业务逻辑吗?利用spring的事件机制改造代码设计模式来实现。

1.申明事件类型

public class OrderEvent extends ApplicationEvent{
private static final long serialVersionUID = 1L; public OrderEvent(Object source) {
super(source);
} }

2.申明事件监听

@Component
class WeiChatListener implements ApplicationListener<OrderEvent>{ @Override
public void onApplicationEvent(OrderEvent event) {
System.out.println("微信发送短信:" + event.getSource());
} }

3.发布事件

 @Autowired
ApplicationContext applicationContext; //1
public String submitOrder(OrderInfo orderinfo){
... // 省略代码
String rsMassage = dao.add(orderinfo);//插入信息
applicationContext.publishEvent(new OrderEvent("我要发财"));
return "" ; //返回是否成功
}

后来老板叫你还要加个普通的短信?现在怎么办 ?修改代码吗 ?No 直接加个普通短信事件监听,注入实例到spring容器就ok了 ;

@Component
class massageListener implements ApplicationListener<OrderEvent>{ @Override
public void onApplicationEvent(OrderEvent event) {
System.out.println("发送不通短信:" + event.getSource());
} }

还要加别的xxx短信 ?? 。ok继续加个Listener,是不是这样优秀多了 0-0

观察者模式之spring事件机制的更多相关文章

  1. Spring事件机制详解

    一.前言 说来惭愧,对应Spring事件机制之前只知道实现 ApplicationListener 接口,就可以基于Spring自带的事件做一些事情(如ContextRefreshedEvent),但 ...

  2. 深入理解Spring事件机制(一):广播器与监听器的初始化

    前言 Spring 从 3.x 开始支持事件机制.在 Spring 的事件机制中,我们可以令一个事件类继承 ApplicationEvent 类,然后将实现了 ApplicationListener ...

  3. spring事件机制

    前置知识补充: 程序里面所谓的“上下文”就是程序的执行环境,打个比方:你就相当于web程序,你的房子就相当于web程序的上下文,你可以在家里放东西,也可以取东西,你的衣食住行都依赖这个房子,这个房子就 ...

  4. 搞清楚Spring事件机制后:Spring的源码看起来简单多了

    本文主讲Spring的事件机制,意图说清楚: 什么是观察者模式? 自己实现事件驱动编程,对标Spring的事件机制 彻底搞懂Spring中的事件机制,从而让大家 本文内容较长,代码干货较多,建议收藏后 ...

  5. 观察者模式模拟YUI事件机制

    首先介绍下YUI的事件机制,很好理解,因为和浏览器事件机制差不多.看懂下面几个方法就可以了: publish: 创建自定义事件.第一个参数是事件类型,第二个参数是一个对象,里面可以设置默认动作 on: ...

  6. Spring 事件机制

    通过模拟邮件的发送,说明Spring的事件监听机制 事件类 package org.zln.module_chapter2.event; import org.springframework.cont ...

  7. Spring 中的事件机制

    说到事件机制,可能脑海中最先浮现的就是日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作.这些listener是怎 ...

  8. Spring 事件监听机制及原理分析

    简介 在JAVA体系中,有支持实现事件监听机制,在Spring 中也专门提供了一套事件机制的接口,方便我们实现.比如我们可以实现当用户注册后,给他发送一封邮件告诉他注册成功的一些信息,比如用户订阅的主 ...

  9. Spring的事件机制详解

    同步事件和异步事件 同步事件:在一个线程里,按顺序执行业务,做完一件事再去做下一件事. 异步事件:在一个线程里,做一个事的同事,可以另起一个新的线程执行另一件事,这样两件事可以同时执行. 用一个例子来 ...

随机推荐

  1. 工程中实际问题解决两例——基于C#

    工程中实际问题解决两例--基于C# 目录 工程中实际问题解决两例--基于C# 1. try catch的妙用 1.1 遇到问题的现象 1.2 原因分析 1.2.1 先从数据库入手 1.2.2 代码日志 ...

  2. 大爽Python入门教程 3-2 条件判断: if...elif..else

    大爽Python入门公开课教案 点击查看教程总目录 简单回顾if 回顾下第一章的代码 >>> x = 5 >>> if x > 0: ... print(&q ...

  3. 设计模式学习-使用go实现享元模式

    享元模式 定义 优点 缺点 适用场景 代码实现 享元模式和单例模式的区别 参考 享元模式 定义 享元模式(Flyweight),运用共享技术有效的支持大量细粒度的对象. 享元模式的意图是复用对象,节省 ...

  4. Alpine容器安装运行ssh

    写在前面 本文介绍了在Alpine容器(docker)上安装运行ssh并保证外界(宿主机)能通过ssh登录的方法,给出了相应的命令.在下在探索过程中借鉴了许多前人的经验,在此先行谢过,所有参考内容都会 ...

  5. Electron快速入门之debug

    view->toggleDevelpper Tools 本地桌面调试 浏览器debug "start": "electron --inspect=5858 .&qu ...

  6. Treevalue(0x03)——函数树化详细解析(下篇)

    好久不见,再一次回到 treevalue 系列.本文将基于上一篇treevalue讲解,继续对函数的树化机制进行详细解析,并且会更多的讲述其衍生特性及应用. 树化方法与类方法 首先,基于之前的树化函数 ...

  7. [ Skill ] 图形化组件在注册 User Trigger 时需要注意的事情

    https://www.cnblogs.com/yeungchie/ 使用 deRegUserTriggers 可以用来配置:当打开一个新窗口时,自动集成自定义的菜单.工具栏等等. 使用格式如下: d ...

  8. CF1578J Just Kingdom

    考虑一个点被填满则他需要从其父亲得到\(q_u = \sum_{v = u\ or\ v \in son_u}m_v\) 那么考虑如何这样操作. 我当时world final做的时候,是从上往下遍历, ...

  9. map与unordered_map区别及使用

    需要引入的头文件不同map: #include <map>unordered_map: #include <unordered_map> 内部实现机理不同map: map内部实 ...

  10. ubuntu常见错误--Could not get lock /var/lib/dpkg/lock

    ubuntu常见错误--Could not get lock /var/lib/dpkg/lock   通过终端安装程序sudo apt-get install xxx时出错:   E: Could ...