【spring源码之publishEvent解析】

2023-12-24 11:49:41

spring源码之publishEvent解析

1. 先看源码code

protected void publishEvent(Object event, @Nullable ResolvableType eventType) {
		Assert.notNull(event, "Event must not be null");

		// Decorate event as an ApplicationEvent if necessary
		ApplicationEvent applicationEvent;
		if (event instanceof ApplicationEvent) {
			applicationEvent = (ApplicationEvent) event;
		}
		else {
			applicationEvent = new PayloadApplicationEvent<>(this, event);
			if (eventType == null) {
				eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();
			}
		}

		// Multicast right now if possible - or lazily once the multicaster is initialized
		if (this.earlyApplicationEvents != null) {
			this.earlyApplicationEvents.add(applicationEvent);
		}
		else {
			getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
		}

		// Publish event via parent context as well...
		if (this.parent != null) {
			if (this.parent instanceof AbstractApplicationContext) {
				((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
			}
			else {
				this.parent.publishEvent(event);
			}
		}
	}

2. 作用说明

这是一个模板方法。
步骤:

  1. 根据事件类型,对事件进行类型下移。
  2. 判断事件广播器是否初始化好
    2.1 如果未初始化好,先将事件存放到list中
    2.2 如果事件广播器已经可以使用,那么直接进行广播
  3. 上述如果没有执行,可以使用父上下文的广播器进行广播事件
    ---------------------------->>>>结束<<<<----------------

文章来源:https://blog.csdn.net/qq_39118371/article/details/135178831
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。