• Spring如何定义监听器


    在日常开发中,有时我们的业务需要快速响应,而采用了异步处理,对于spring本身来讲,它提供了一种机制,即监听器 ApplicationListenter,想必它很多的人都比较熟悉。
    对于此监听器定义,我们有以下三种类型,分别如下

    • 实现ApplicationListener接口,然后让spring的扫描到,如使用@Service、@Import、SPI等机制都可以把监听器加入到spring中。这个添加的过程,是spring自动完成的。具体的过程上,参照下面的第一种实现方式。
    • 在某一个Bean的public方法上使用@EventListener标识,spring容器在启动的过程中,会把这个方法包装成一个监听器。这个过程,也是spring自动完成的。具体的过程上,参照下面的第二种实现方式。
    • 依然是实现ApplicationListener接口,然后通过ApplicationContext实例,手动地调用 addApplicationListener 方法,即可把监听器监听到spring中。具体的过程上,参照下面的第三种实现方式。

    方式一

    在AbstractApplicationContext中的 refresh 方法,调用了 registerListeners 方法,方法内容如下图所示
    在这里插入图片描述
    通过上面这个图可以看到,将所有ApplicationListener的实现的beanName加入是ListenerRetriever类中的applicationListeners容器中,注意它是一个Set类型的容器。注意,在这一时刻拿到的实例名称还是在开始实例bean之前,在 finishBeanFactoryInitialization 方法之前调用。也就是说,在这一时刻注册的监听器并不是我们自己的定义的监听器。
    那么问题来了,这里注册的监听器是哪里获取的呢?
    这就是要说到事件发布了。我们可以通过 ApplicationContext 的 publishEvent 方法作为入口
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    从上面这几个图,可以看到,非自定义的监听器是如何生效的。

    当然言归正传,我们得说一下我们自己定义的常规监听是如何生效的。这里就不得不提一个PostProcessor了,它就是 ApplicationListenerDetector
    当我们自定义的Listener在实例的过程中,ApplicationListenerDetector就会起作用,这个起作用的方法内容如下
    在这里插入图片描述
    通过上面这个图,可以发现,是由applicationContext 把自定义的监听器加入到的spring对应的容器中去。其实手动地添加监听器,也就是调用 applicationContext.addApplicationListener 方法的

    方式二

    我们可以一个bean 的某个方法上使用@EventListener标识,来完成监听器的声明,具体做法,如下图所示
    在这里插入图片描述
    问题来了,就这样简单的声明一下,spring是如何将其包装成监听器的呢?
    这里就得提到一个 BeanFactoryPostProcessor。至于它是在哪里声明的,如下图所示
    在这里插入图片描述
    由于EventListenerMethodProcessor是SmartInitializingSingleton一个实例,所以待容器中的所有的bean都实例完成后,就会调用它的 afterSingletonsInstantiated 方法。代码内容如下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    怎么样,到这里是不是就很清晰了!

  • 相关阅读:
    Nginx
    华硕电脑怎么录屏?分享实用录制经验!
    恒运资本:如何分析股票的成长性?为什么股票不涨?
    JVM各种情况内存溢出分析
    [JS真好玩] 嘘!我改了掘金源代码!1行代码,让表格支持page_size切换,从每页10条变为20条!
    Three.js 中的场景与相机基础
    java笔记37,Lambda表达式
    AtCoder Beginner Contest 262 部分题解
    科技资讯|苹果Vision Pro可通过手势ID检测不同用户
    Java集合04:TreeSet练习
  • 原文地址:https://blog.csdn.net/weixin_32822759/article/details/136400248