Spring事件通知

1.编写自定义的事件载体对象

  1. /**
  2. * @Author:qmfang
  3. * @Description: 继承自事件对象,表明将其作为一个事件通知对象
  4. * @Date:Created in 10:35 2018/4/8
  5. * @Modified By:
  6. */
  7. @Data
  8. public class BlackListEvent extends ApplicationEvent {
  9. private final String address;
  10. private final String test;
  11. public BlackListEvent(Object source, String address, String test) {
  12. super(source);
  13. this.address = address;
  14. this.test = test;
  15. }
  16. }

2.编写事件触发对象

  1. /**
  2. * @Author:qmfang
  3. * @Description: 实现以aware结尾的接口之后在bean被实例化之后会Spring会注入相应的资源
  4. * @Date:Created in 10:37 2018/4/8
  5. * @Modified By:
  6. */
  7. public class EmailService implements ApplicationEventPublisherAware {
  8. private List<String> blackList;
  9. private ApplicationEventPublisher publisher;
  10. public void setBlackList(List<String> blackList) {
  11. this.blackList = blackList;
  12. }
  13. @Override
  14. public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
  15. /**
  16. * 此处也就是注册进入应用事件发布对象
  17. */
  18. this.publisher = applicationEventPublisher;
  19. }
  20. public void sendEmail(String address, String test) {
  21. if (blackList.contains(address)) {
  22. /**
  23. * 如果是包含的地址将发布该消息
  24. */
  25. BlackListEvent event = new BlackListEvent(this, address, test);
  26. publisher.publishEvent(event);
  27. return;
  28. }
  29. }
  30. }

3.编写相应的事件监听对象

  1. /**
  2. * @Author:qmfang
  3. * @Description: 实现ApplicationListener的接口将监听相应的事件,当有事件时,将触发onApplicationEvent方法
  4. * @Date:Created in 10:44 2018/4/8
  5. * @Modified By:
  6. */
  7. public class BlackListNotifier implements ApplicationListener<BlackListEvent> {
  8. @Override
  9. public void onApplicationEvent(BlackListEvent event) {
  10. System.out.println("应用事件:" + event);
  11. }
  12. }

4.将相应的对象注入到容器

  1. /**
  2. * @Author:qmfang
  3. * @Description:
  4. * @Date:Created in 9:58 2018/4/8
  5. * @Modified By:
  6. */
  7. @Configuration
  8. public class MvcConfig {
  9. @Bean
  10. public EmailService emailService() {
  11. EmailService emailService = new EmailService();
  12. List list = Arrays.asList("known.spammer@example.org", "known.hacker@example.org", "john.deo@example.org");
  13. emailService.setBlackList(list);
  14. return emailService;
  15. }
  16. @Bean
  17. public BlackListNotifier blackListNotifier() {
  18. BlackListNotifier blackListNotifier = new BlackListNotifier();
  19. return blackListNotifier;
  20. }
  21. }

4.编写测试

  1. @RestController
  2. public class TestController {
  3. @Autowired
  4. private EmailService emailService;
  5. /**
  6. * 127.0.0.1:8886/test
  7. *
  8. * @return
  9. */
  10. @GetMapping("/test")
  11. public Object get() {
  12. emailService.sendEmail("known.spammer@example.org", "test@test");
  13. return "hello";
  14. }
  15. }

基于注解的事件处理

基于注解的可以将BlackListNotifier修改为如下形式

  1. /**
  2. * @Author:qmfang
  3. * @Description: 实现ApplicationListener的接口将监听相应的事件,当有事件时,将触发onApplicationEvent方法
  4. * @Date:Created in 10:44 2018/4/8
  5. * @Modified By:
  6. */
  7. public class BlackListNotifier {
  8. /**
  9. * 也可以基于注解的形式 参数表名了需要监听的事件类型
  10. *
  11. * @param event
  12. */
  13. @EventListener
  14. public void onApplicationEvent(BlackListEvent event) {
  15. System.out.println("应用事件:" + event);
  16. }
  17. /**
  18. * 如果方法需要监听好几个事件,或者如果定义的方法没有任何参数,也可以在注解自身上指定事件类型
  19. */
  20. @EventListener({ContextStartedEvent.class, ContextRefreshedEvent.class})
  21. public void handleContextStart() {
  22. System.out.println("监听到事件");
  23. }
  24. /**
  25. * 也可以通过定义SpEL表达式的注解condition属性添加额外的运行时过滤,
  26. * 他们应该匹配以实际调用特定事件的方法,例如如果事件的test属性等于foo
  27. * 才回调该方法
  28. * <p>
  29. * SpEL可用的元数据
  30. * 名字 位置 描述 例子
  31. * Event事件 根对象 实际应用事件 #root.event
  32. * Arguments array参数数组 根对象 用于目标数组 #root.args[0]
  33. * Argumentname参数名称 评估上下文 任意方法参数的名字
  34. */
  35. @EventListener(condition = "#event.test=='foo'")
  36. public void onApplicationEvent2(BlackListEvent event) {
  37. System.out.println("应用事件2:" + event);
  38. }
  39. /**
  40. * 如果需要发布一个事件作为另一个事件的结果,只需要更改方法签名返回应该发布的事件即可
  41. * 注意点是:异步事件不支持此功能
  42. */
  43. @EventListener
  44. public OtherEvent handlerBlackListEvent(BlackListEvent event) {
  45. }
  46. }
转载出处:https://blog.csdn.net/fang_qiming/article/details/79849394

Spring 事件通知相关推荐

  1. spring事件通知机制详解

    优势 解耦 对同一种事件有多种处理方式 不干扰主线(main line) 起源 要讲spring的事件通知机制,就要先了解一下spring中的这些接口和抽象类: ApplicationEventPub ...

  2. 案例学习BlazeDS+Spring之八InSync06“松耦合”UI同步事件通知

    InSync06:增加"松耦合"UI同步事件通知 一.运行DEMO: 1.运行程序:http://localhost:8400/spring-flex-testdrive/insy ...

  3. Spring5源码 - 11 Spring事件监听机制_源码篇

    文章目录 pre 事件监听机制的实现原理[观察者模式] 事件 ApplicationEvent 事件监听者 ApplicationEvent 事件发布者 ApplicationEventMultica ...

  4. Spring IoC 源码系列(三)Spring 事件发布机制原理分析

    在 IoC 容器启动流程中有一个 finishRefresh 方法,具体实现如下: protected void finishRefresh() {clearResourceCaches();init ...

  5. Spring事件机制详解

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

  6. Spring事件的观察者模式

    介绍 观察者模式的本质是"定义对象之间的一对多依赖关系,以便当一个对象改变状态时,其所有依赖关系都会得到通知并自动更新." GoF. 观察者模式是发布/订阅模式的子集,它允许许多观 ...

  7. dubbo学习之事件通知实践

    目录 实践 dubbo-demo-interface dubbo-demo-xml-provider notify-provider.xml UserNotifyServiceImpl Provide ...

  8. windows事件id大全_技术转载 || springboot+redis做过期事件通知业务

    我的业务场景 系统管理员要给维护员分配巡查路口设施的工作,由于路口比较多,管理员不知道哪些路口已经被分配了,况且过了一个时间周期后,所有的路口要再次被巡查. 思路 我建立了一个表,里面是所有路口和是否 ...

  9. Spring事件发布机制

    目录 前言 一.事件驱动机制 二.Spring的事件发布机制 三.Spring事件使用实例 四.Spring事件驱动的实现原理 总结: 前言 在设计模式中有一种设计模式叫做观察者设计模式,观察者模式的 ...

最新文章

  1. Fiddler监控面板显示Server栏(Fiddler v5.0)
  2. 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来
  3. pycharm以及flask的安装
  4. python二十四:python练习题
  5. swoole 定时器
  6. 风格迁移应用_[风格迁移][超分][ECCV2016]Perceptual Losses for Real...
  7. linux配置chrony时间同步
  8. python编译安装没有c扩展_为什么在安装simplejson时得到“C扩展无法编译”?
  9. leetcode24. 两两交换链表中的节点
  10. 计算机组成与系统原理中的节拍是什么意思?
  11. Python小白的数学建模课-06.固定费用问题
  12. JavaScript原生对象属性和方法详解——Array对象
  13. Nginx-1.6.2更改端口
  14. 8.剑指Offer --- 英文版新增面试题
  15. 23. Element lastChild 属性
  16. 是时候考虑怎么用好云了
  17. 最完整的国内手机号段
  18. linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机
  19. 南宁装修工长带队,价格公道不乱增加项目
  20. C# Invoke,begininvoke的用法详解

热门文章

  1. 大数据基础平台搭建-(一)基础环境准备
  2. php 上取整函数是,PHP取整函数:ceil,floor,round,intval的区别详细解析
  3. Tether印刷8月已发行价值4.15亿美元代币
  4. 10月24 日 c语言 计算1至10之间奇数之和及偶数之和。
  5. mysql如何复制一个数据库
  6. PIXHAWK飞机侧翻原因
  7. tcp/ip四层模型之网络层
  8. Java实现数组的冒泡排序
  9. 短信发送平台的推广技巧有哪些?3个小技巧要记牢
  10. 《大学数学手册》摘抄