James Harden13
2020-09-12
跟到小马哥学到了很多东西,不仅教会了我怎么用,还通过看源码了解更多细节,希望老师能出更多优秀的课程。这节课总结:在AbstractApplicationContext#refresh方法中, registerBeanPostProcessors(beanFactory)->initApplicationEventMulticaster()。registerBeanPostProcessors:将实现BeanProcessor接口的bean提前出例化,此时在postProcessBeforeInitialization调用publish方法发布事件就会出现bug,因为EventMulticaster是在 initApplicationEventMulticaster里初始化的.所以用earlyApplicationEvents来存储提前发布的Event事件
作者回复: 谢谢支持~
5
丁小明
2020-08-24
又学到一招! 自己看源码的时候很难想到原来是因为这个!看了半天没想象到场景
作者回复: 细节很重要~
1
小马哥Spring
2021-04-14
2.SpringContext继承了ApplicationEventPublisher,其事件发布的功能还是委托给ApplicationEventMulticaster实现。 3.spring3.x框架使用时应注意不要同时实现ApplicationEventPublisher和BeanPostProcessor,因为BeanPostProcessor注册时会使用bean依赖查找,而依赖查找就会触发bean的初始化过程,bean的初始化过程之中就有aware的回调,这个时候set ApplicationEventPublisher就是ApplicationContext,根据2,ApplicationContext是通过ApplicationEventMulticaster,但是此时ApplicationEventMulticaster还没有初始化呢,因此就会造成可能发布事件空指针。
作者回复: 总结到位~
大俊stan
2020-07-22
小马哥,感觉你没讲清楚为什么加上BeanPostProcessor后会调用发布事件的接口
作者回复: 建议多看几遍,实际上,这个问题是由于 AbstractApplicationContext 实现提早出发事件的发布
共 8 条评论
黑客时间
2021-07-21
被@EventListener标注的方法好像监听不到早期事件吧,我看源码中的finishBeanFactoryInitialization(beanFactory)会调用beanFactory.preInstantiateSingletons()方法,在这个方法中会回调SmartInitializingSingleton的afterSingletonsInstantiated()方法。而处理@EventListener的EventListenerMethodProcessor刚好实现了SmartInitializingSingleton接口。 所以被@EventListener标注的方法初始化会晚于registerListeners() 方法