spring中的事件驱动

1、最通俗的理解:

spring ioc容器applicationContext它有一个组件叫事件多播器(ApplicationEventMulticaster),多播器是一堆监听者(applicationListener)的容器,applicationContext执行publishEvent()方法发布一个事件,它会主动for循环遍历多播器中的监听者来执行监听者的回调方法。


2、spring中会出现哪些事件:

1)spring ioc容器刷新完成时,会发布ContextRefreshedEvent事件
2)进程运行中,程序员的自定义方法里通过applicationContext发布事件
3)spring ioc容器关闭会发布ContextClosedEvent


3、使用spring监听机制步骤:

1)写监听器

方法1:
写一个监听器(ApplicationListener实现类)来监听某种事件(ApplicationEvent及其子类)
方发2:
@EventListener;
原理:使用EventListenerMethodProcessor处理器来解析方法上的@EventListener,如果一个组件包含一个@EventListener方法,则这个组件就是监听器。

2)把监听器加入到容器;

3)只要ioc容器中有相关事件的发布,我们就能监听到这个事件

例如一些ioc容器的系统事件:
ContextRefreshedEvent事件:容器刷新完成(所有bean都完全创建)会发布这个事件
ContextClosedEvent事件:关闭容器会发布这个事件
于是,相应监听器的回调方法就会执行。

4)spring ioc容器如何发布一个事件:

applicationContext.publishEvent(事件)


4、事件发布后(即执行publishEvent()方法),会发生什么:

3)publishEvent(new ContextRefreshedEvent(this));
a)获取事件的多播器(派发器):getApplicationEventMulticaster()
b)多播器调用multicastEvent( )派发事件:
c)multicastEvent( )的伪代码逻辑:

          //获取到所有订阅此事件的ApplicationListener;
		  for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
			  /*
			  a)如果有Executor,可以支持使用Executor进行异步派发;
				   Executor executor = getTaskExecutor();
			  b)否则,同步的方式直接执行listener方法:
			   invokeListener(listener, event),拿到listener回调onApplicationEvent(  )方法;
			  */

相关源码:
在这里插入图片描述


5、事件多播器(派发器)什么时候诞生

1)ioc容器创建对象:进入refresh()方法
2)refresh()中的initApplicationEventMulticaster(),这里即是初始化ApplicationEventMulticaster组件
  a)先去容器中找有没有id=[ applicationEventMulticaster ]的组件,存在则什么都不做。
  b)如果没有则执行this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory),并且通过beanFactory.registerSingleton(String beanName, Object singletonObject)方法将事件多播器加入到ioc容器中。


6、监听器在什么时候被保存到事件多播器

1)容器创建对象:进入refresh();
2)refresh()中的registerListeners();
简约代码:

 	 //从容器中拿到所有的监听器,把他们注册到[ applicationEventMulticaster ]中;
	 String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
	 
	 //将listener注册到ApplicationEventMulticaster中
	 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值