Spring观察者模式之事件发布订阅实现和源码详解

 更新时间:2024年01月09日 08:50:06   作者:it_lihongmin  
这篇文章主要介绍了Spring观察者模式之事件发布订阅实现和源码详解,Spring认为发布订阅主题,其实可以理解为事件驱动的编码,先来实现以下Spring容器中的事件发布订阅,需要的朋友可以参考下

前言

我们现在很多时候开发环境已经在Spring的ApplicationContext容器中,已经必须要自己再去使用jdk实现。

Spring认为发布订阅主题,其实可以理解为事件驱动的编码,先来实现以下Spring容器中的事件发布订阅。

个人认为事件驱动的发布订阅模型,也算是观察者模式(不论是推还是拉的方式)。

spring事件驱动(特别是SpringBoot扩展后)可以很方便的进行实现,那么肯定不会自己去使用Observer的模式。

1、Spring事件的发送方式

可以使用下面两种方式,但其实都是一样的,后面进行分析:

  • applicationContext.publishEvent(new UserEvent(user));
  • applicationEventPublisher.publishEvent(new UserEvent(user));
@Service("eventUserService")
public class UserService implements ApplicationContextAware, 
    ApplicationEventPublisherAware {
 
    private ApplicationContext applicationContext;
    private ApplicationEventPublisher applicationEventPublisher;
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
 
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }
 
    public String addUser(User user) {
        // 保存用户
        user.setId(1L);
        user.setName("name-1");
        // 发生事件(发邮件、发短信、、、)
        applicationContext.publishEvent(new UserEvent(user));
        // 两种发送方式一致
        applicationEventPublisher.publishEvent(new UserEvent(user));
        return "ok";
    }
 
}

2、Spring事件的接收方式

1)、继承ApplicationListener 接口,实现onApplicationEvent方法

详细见我写的Spring源码分析:Spring源码-事件监听机制(实现EventListener接口)

总结

1、ApplicationContext发送事件是委托给了一个Spring容器在refresh时初始化的SimpleApplicationEventMulticaster

bean(由于没有初始化内部线程池对象,所以事件是同步发送的)。

2、发送前先获取事件的ResolvableType类型(当前为OrderEvent clazz)和事件源类型(当前为String)

3、获取监听者列表。 先去自己Bean内部先查询缓存,否则从BeanFactory中获取所有单利bean进行匹配(再放入缓存ConturrentHashMap)。

4、监听者列表循环(同步或异步)地调用我们自己写的监听方法OnApplicationEvent。

相同和不同之处

相同:

1、ApplicationContext的refresh方法还是初始化了SimpleApplicationEventMulticaster

2、发送事件式还是先获取ResolvableType类型,再获取发送监听列表

不同:

1、获取监听列表返回的已经是处理过的列表。

2、添加了@EventListener注解的自定义名称的方法,会在EventListenerMethodProcessor中的afterSingletonsInstantiated()方法中遍历所有 ApplicationContext容器的单利bean。将所有添加了@EventListener的方法注入到ApplicationContext的applicationListeners和 初始化的SimpleApplicationEventMulticaster的defaultRetriever.applicationListeners中,在发送事件时候获取监听列表时用。

到此这篇关于Spring观察者模式之事件发布订阅实现和源码详解的文章就介绍到这了,更多相关Spring事件发布订阅实现和源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java多线程模拟抢红包功能

    java多线程模拟抢红包功能

    这篇文章主要为大家详细介绍了java多线程模拟抢红包功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • SpringBoot中时间格式化的五种方法汇总

    SpringBoot中时间格式化的五种方法汇总

    时间格式化在项目中使用频率是非常高的,这篇文章主要给大家介绍了关于SpringBoot中时间格式化的五种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • Java面试题 从源码角度分析HashSet实现原理

    Java面试题 从源码角度分析HashSet实现原理

    这篇文章主要介绍了Java面试题 从源码角度分析HashSet实现原理?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • SWT JFace 小制作 文本阅读器

    SWT JFace 小制作 文本阅读器

    SWT JFace 小制作 文本阅读器
    2009-06-06
  • Java的几个重要版本_动力节点Java学院整理

    Java的几个重要版本_动力节点Java学院整理

    jdk8 将在2014年3月份发布,迄今为止,可能是最大更新的java版本,也是令人期待的一个版本,在Java中引入闭包概念对Java程序开发方法的影响甚至会大于Java5中引入的泛型特征对编程方式带来的影响
    2017-06-06
  • springboot 项目使用jasypt加密数据源的方法

    springboot 项目使用jasypt加密数据源的方法

    Jasypt 是一个 Java 库,它允许开发者以最小的努力为他/她的项目添加基本的加密功能,而且不需要对密码学的工作原理有深刻的了解。接下来通过本文给大家介绍springboot 项目使用jasypt加密数据源的问题,一起看看吧
    2021-11-11
  • spring boot微服务场景下apollo加载过程解析

    spring boot微服务场景下apollo加载过程解析

    apollo 是一个开源的配置中心项目,功能很强大,apollo 本身的配置项并不复杂,但是因为配置的路径特别多,非常容易搞混了, 所以本文试图聚焦 spring-boot 的场景,在 spring-boot 微服务场景下,搞清楚 apollo-client的加载过程
    2022-02-02
  • JAVA基础面试题整理

    JAVA基础面试题整理

    在本篇文章里小编给大家整理的是关于JAVA基础面试题的整理内容,需要的朋友们可以参考下。
    2019-10-10
  • JavaMail整合Spring实现邮件发送功能

    JavaMail整合Spring实现邮件发送功能

    这篇文章主要为大家详细介绍了JavaMail整合Spring实现邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)

    深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)

    通常来讲,重构是指不改变功能的情况下优化代码,但本文所说的重构也包括了添加功能。这篇文章主要介绍了重构Mybatis与Spring集成的SqlSessionFactoryBean(上)的相关资料,需要的朋友可以参考下
    2016-11-11

最新评论