zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Spring监听器-spring源码详解(五)

2023-02-18 16:29:02 时间

上篇文章说了:

Spring循环依赖-spring源码详解(四)

前面介绍了springIOC在上面那个方法里实现,那么下面这个方法里实现了什么呢?在springBean创建完之后的扩展代码。

contextRefreshEvent事件监听上下文初始化方法。

当我们想在容器结束的时候进行扩展,就可以写一个监听器,监听contextClosedEvent事件。

监听事件可以通过@component基于接口实现applicationListener,泛型传入需要监听的事件。

也可以通过注解,@EventListener(事件)

Spring事件监听器有三个部分组成:

事件(applicationEvent):事件一发布。

监听器(applicationListener):观察者 则监听到 ,做一些事。

事件发布器(applicationEventMulticaster):发布事件。

从第一个方法里可以看到,这里把容器激活,因为在后面getBean方法的时候,会断言容器必须是激活状态,才会执行初始化bean。

这里有一个早期监听器,不需要手动调用publicEvet。

ClassPathXmlApplicationContext在这里就会通过loadBeanDefinitions来加载bean。

AnnocationApplicationContext在这里则是设置了序列化id。

下面则开始对bean工厂进行填充,这里注册了加载器,

注册了applicationContextAwareProcessor。

这里会在beanPostProcessorBeforeInitialization调用。

这里还注册了applicationContext、beanFactory等。

后面则就注册了事件监听的后置处理器ApplicationlistenerDetector解析(接口监听器)。

监听器则是在beanPostProcessorAtferInitialization调用。

后面这里就到了事件多播器,当自己自己定义了applicationEventMulticaster的时候,则就创建。

没有则创建一个simpleApplicationEventMulticaster。

当调用publicEvent的时候,则就会调用事件多播器去广播所有事件。这里会管理所有的监听器。

在后面一张图就是 registerListeners。

这里getBeanNamesForType是注解的方式获取 监听器,接口的方式则获取不到。

现获取早期事件,这里将早期的时间赋值null,则没有早期事件了。也就不会自动广播了,全部通过多播器广播。

于是最后就到了我们文章开头发的publicEvent。