42、扩展原理-ApplicationListener原理

  • 有三个事件
  • ContextRefreshedEvent、Test_Ext$1[source=我发布了一个事件]、ContextClosedEvent
  1. ContextRefreshedEvent事件:

    1. 容器创建对象:refresh();
    2. finishRefresh();容器刷新完成会发布ContextRefreshedEvent事件
  2. 自己发布事件;
  3. 容器关闭会发布ContextClosedEvent;

【事件发布流程】:

publishEvent(new ContextRefreshedEvent(this));

1)、获取事件的多播器(派发器):getApplicationEventMulticaster()
2)、multicastEvent派发事件:
3)、获取到所有的ApplicationListener;
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
  1. 如果有Executor,可以支持使用Executor进行异步派发;

    Executor executor = getTaskExecutor();
  2. 否则,同步的方式直接执行listener方法;invokeListener(listener, event);

    1. 拿到listener回调onApplicationEvent方法;

【事件多播器(派发器)】:

1)、容器创建对象:refresh();
2)、initApplicationEventMulticaster();初始化ApplicationEventMulticaster;
  1. 先去容器中找有没有id=“applicationEventMulticaster”的组件;

  2. 如果没有

    this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
    并且加入到容器中,我们就可以在其他组件要派发事件,自动注入这个applicationEventMulticaster;

【容器中有哪些监听器】:

1)、容器创建对象:refresh();
2)、registerListeners();
// 从容器中拿到所有的监听器,把他们注册到applicationEventMulticaster中;
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
// 将listener注册到ApplicationEventMulticaster中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

最新文章

  1. 记一次.NET代码重构
  2. Windows Server 2012 中80端口被PID为4的系统进程占用解决方法
  3. (原创)mybaits学习三,springMVC和mybatis融合
  4. ivqBlog 开源博客 (angularjs + express + mongodb)
  5. android 学习随笔一(配置调试与基础)
  6. 中南大学第一届长沙地区程序设计邀请赛 New Sorting Algorithm
  7. C# virtual和override
  8. DIV 清除样式浮动万能代码
  9. MFS学习总结
  10. 从零开始学Xamarin.Forms(四) Android 准备步骤(添加第三方Xamarin.Forms.Labs库)
  11. Nagios监控lvs服务
  12. pychon - selenium2Libray源码简介
  13. python中的slice用法
  14. 创建以mybatis为基础的web项目(1)
  15. RISC-V踩坑记----__builtin_clz((x)库函数的应用
  16. Redis使用和部分源码剖析以及Django缓存和redis的关系
  17. PL/SQL学习笔记之事务
  18. 使用Aspose.Cells生成Excel的线型图表
  19. Spring Advice
  20. navicat和 plsql 连接oracle数据库 总结

热门文章

  1. PAT(B) 1083 是否存在相等的差(Java)统计
  2. vue+iview+mock模拟数据遍历
  3. 2.33模型--去除字符串两头空格.c
  4. hdu 6562 Lovers (线段树)
  5. Spring Cloud Alibaba学习笔记(13) - Spring Cloud Stream的监控与异常处理
  6. linux 命令行 光标移动技巧等
  7. github新建远程仓库初始化记录
  8. iOS - 基础知识总结(OC版) 面试必看 再不看就要用swift了
  9. OpenStack kilo版(3) Nova部署
  10. python中read()、readline()、readlines()区别