前面说了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。