• 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 方法。代码内容如下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    怎么样,到这里是不是就很清晰了!

  • 相关阅读:
    Java排序算法(六):希尔排序
    利用pybind11在python中使用C++
    宏定义里面为什么要加括号?
    aspose.cells java合并多个excel
    CAT1 4G+以太网开发板腾讯云手机微信小程序显示温度和下发控制
    《React扩展知识二》PureComponent / render props / Error boundary /组件通信方式总结
    【精选】发布应用到应用商店的基本介绍
    【Git】idea2022版集成并使用Git
    系统国产化之-达梦数据库基础操作命令
    SAP BASIS SET_PARAMETER_ID_TOO_LONG
  • 原文地址:https://blog.csdn.net/weixin_32822759/article/details/136400248