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当中的事件.

总结

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

相关文章

  • SpringBoot中通过8项配置优化提升Tomcat性能的配置方法

    SpringBoot中通过8项配置优化提升Tomcat性能的配置方法

    优化Spring Boot,Spring Cloud 应用程序中Tomcat的配置有助于提高性能和资源利用率,这篇文章主要介绍了SpringBoot中通过8项配置优化提升Tomcat性能的配置方法,需要的朋友可以参考下
    2024-08-08
  • 带你了解Java中的Mono接口

    带你了解Java中的Mono接口

    Mono是ProjectReactor库的核心类型之一,用于处理0或1个元素的异步数据流,本文主要介绍了带你了解Java中的Mono接口,具有一定的参考价值,感兴趣的可以了解一下
    2026-04-04
  • Character.UnicodeBlock中cjk的说明详解

    Character.UnicodeBlock中cjk的说明详解

    这篇文章主要为大家详细介绍了Character.UnicodeBlock中cjk的说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java 不使用第三方变量交换两个变量值的四种方法详解

    Java 不使用第三方变量交换两个变量值的四种方法详解

    这篇文章主要介绍了四种不使用第三方变量交换两个变量值的方法。文中对于四种方法进行了详细的分析,需要的小伙伴们可以跟随小编一起学习一下
    2021-12-12
  • SpringBoot3整合Mybatis完整版实例

    SpringBoot3整合Mybatis完整版实例

    本文详细介绍了SpringBoot3整合MyBatis的完整步骤,包括添加数据库驱动和MyBatis依赖、配置数据源和MyBatis、创建表和Bean类、编写Mapper接口和XML文件、创建Controller类以及配置扫描包,通过这些步骤,可以实现SpringBoot3与MyBatis的成功整合,并进行功能测试
    2025-01-01
  • springBoot静态资源加载不到,并且配置了也不生效问题及解决

    springBoot静态资源加载不到,并且配置了也不生效问题及解决

    这篇文章总结了一个在Spring Boot 2.6.x版本中,由于路径匹配策略改变导致静态资源无法加载的问题,并提供了解决方案:通过配置类或在配置文件中设置路径匹配策略为AntPathMatcher,或者直接降级Spring Boot版本
    2025-02-02
  • java短路逻辑运算符实例用法详解

    java短路逻辑运算符实例用法详解

    在本篇文章里小编给大家分享的是一篇关于java短路逻辑运算符实例用法内容,有需要的朋友们可以学习参考下。
    2021-04-04
  • Java实现电影院订票系统代码

    Java实现电影院订票系统代码

    这篇文章主要介绍了Java实现电影院订票系统代码,代码实现了界面类登录注册类,用户类等,具有一定参考价值,需要的朋友可以参考下。
    2017-11-11
  • SpringBoot+Mybatis实现登录注册的示例代码

    SpringBoot+Mybatis实现登录注册的示例代码

    这篇文章主要介绍了SpringBoot+Mybatis实现登录注册的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 浅谈Java 代理机制

    浅谈Java 代理机制

    Java 有两种代理方式,一种是静态代理,另一种是动态代理。如果我们在代码编译时就确定了被代理的类是哪一个,那么就可以直接使用静态代理;如果不能确定,那么可以使用类的动态加载机制,在代码运行期间加载被代理的类这就是动态代理
    2021-06-06

最新评论