• 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() 方法
    
    