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



怎么样,到这里是不是就很清晰了!