springBoot中观察者模式详解

 更新时间:2024年11月07日 08:42:02   作者:Dubbo-罗  
观察者模式增强应用的灵活性和可扩展性,利用java.util.Observable和java.util.Observer实现,Spring通过ApplicationEvent类和事件广播器管理事件,支持应用上下文和请求相关的事件处理,实现松耦合和动态通知,优点包括松耦合、动态通知、易于扩展

观察者设计模式

  • jie神说用订阅和发布来理解更好,我想了一下是的
  • 为什么呢?因为监听器这个名词听起来是一个主动的,可实际监听器是一个被动的玩意
  • 比如我们事件源发布一个事件,然后监听器订阅了这个事件就能做出动作。
  • 里面涉及到三个对象,事件源,事件、监听器,大家好好理解一下

特点:

  • 持有监听的观察者的引用
  • 支持增加和删除观察者
  • 主题状态改变,通知观察者

观察者implements Observer 重写update方法:

  • 当被观察者发生变化,收到通知进行具体的处理
  • 可以随时取消

优点松耦合:

  • 观察者增加或删除无需修改被观察者的代码,只需调用被观察者对应的增加或者删除的方法即可
  • 被观察者只是负责通知观察者,但无需了解观察者如何处理通知
  • 观察者只需等待被观察者通知,无需观察被观察者相关的细节

有点通知不错过:

  • 由于被动接受,正常情况下不会发生错过主题的改变通知.而主动获取的话,由于时机选取问题,可能导致错过某些状态.

Java实现:

java中有观察者模式使用的API

  • java.util.Observable这是一个类 继承,这是被观察者.
  • java.util.Observer这是一个接口 实现,这是观察者,也是监听器

开关的重要性:

  • 可以筛选通知
  • 可以撤销通知
  • 可以控制通知

Spring中的Events

事件通过org.springframework.context.ApplicationEvent实例来表示。

这个抽象类继承扩展了java.util.EventObject,可以使用EventObject中的getSource方法,我们可以很容易地获得所发生的给定事件的对象。

这里,事件存在两种类型,其实EventObject就是事件的接口.事件有非常多,都可以实现这个接口,那么这个事件就有自己的东西.

1.与应用程序上下文相关联

所有这种类型的事件都继承自org.springframework.context.event.ApplicationContextEvent类。它们应用于由org.springframework.context.ApplicationContext引发的事件(其构造函数传入的是ApplicationContext类型的参数)。

这样,我们就可以直接通过应用程序上下文的生命周期来得到所发生的事件:ContextStartedEvent在上下文启动时被启动,当它停止时启动ContextStoppedEvent,当上下文被刷新时产生ContextRefreshedEvent,最后在上下文关闭时产生ContextClosedEvent

2.与request 请求相关联

org.springframework.web.context.support.RequestHandledEvent实例来表示,当在ApplicationContext中处理请求时,它们被引发。

Spring如何将事件分配给专门的监听器?

这个过程由事件广播器来实现,由org.springframework.context.event.ApplicationEventMulticaster接口的实现表示。

此接口定义了3种方法

  1. addApplicationListener() 添加新的监听器**:定义了两种方法来添加新的监听器:addApplicationListener(ApplicationListener<?> listener)addApplicationListenerBean(String listenerBeanName)。当监听器对象已知时,可以应用第一个。如果使用第二个,我们需要将bean name 得到listener对象(依赖查找DL),然后再将其添加到listener列表中
  2. removeApplicationListenerBean(String listenerBeanName) 删除监听器:添加方法一样,我们可以通过传递对象来删除一个监听器(**removeApplicationListener(ApplicationListener<?> listener)**或通过传递bean名称。第三种方法,**removeAllListeners()**用来删除所有已注册的监听器
  3. **multicastEvent(ApplicationEvent event)**将事件发送到已注册的监听器

在JDK当中也封装了事件,但是用到了swing的编程中去了.也就是java中的事件:EventListener,只不过这个接口是用到了swing编程中去了.

EventObject也就是Java当中的事件.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中List add添加不同类型元素的讲解

    Java中List add添加不同类型元素的讲解

    今天小编就为大家分享一篇关于java的List add不同类型的对象,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java移除无效括号的方法实现

    Java移除无效括号的方法实现

    本文主要介绍了Java移除无效括号的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java实现读取Word模板文档并替换内容生成新文档

    Java实现读取Word模板文档并替换内容生成新文档

    在实际开发中,经常会遇到需要根据 Word 模板生成特定文档的需求,下面小编就来为大家介绍一下如何使用 Apache POI 库来读取 Word 模板文档,然后替换其中的指定内容最后生成新的文档吧
    2025-02-02
  • SpringBoot项目为何引入大量的starter?如何自定义starter?

    SpringBoot项目为何引入大量的starter?如何自定义starter?

    这篇文章主要介绍了SpringBoot项目为何引入大量的starter?如何自定义starter?文章基于这两个问题展开全文,需要的小伙伴可以参考一下
    2022-04-04
  • SpringBoot数据校验功能的实现

    SpringBoot数据校验功能的实现

    这篇文章主要介绍了SpringBoot数据校验功能的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • java 通过 SmbFile 类操作共享文件夹的示例

    java 通过 SmbFile 类操作共享文件夹的示例

    这篇文章主要介绍了java 通过 SmbFile 类操作共享文件夹,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    本篇文章主要介绍了详解spring boot集成ehcache 2.x 用于hibernate二级缓存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别

    浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别

    下面小编就为大家带来一篇浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 面试题:用 Java 逆序打印链表

    面试题:用 Java 逆序打印链表

    这篇文章主要介绍了面试题:用 Java 逆序打印链表,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java中Lombok常用注解分享

    Java中Lombok常用注解分享

    以前的Java项目中充斥了太多不友好的代码,这些代码不仅没有什么技术含量,还影响代码的美观,所以Lombok应运而生了。本文和大家分享了一些Java中Lombok常用注解,需要的可以了解一下
    2023-04-04

最新评论