spring加载流程refresh之registerListeners()

注册监听器

  • registerListeners
    • 通过addApplicationListener(listen)注册监听器
    • 自定义实现ApplicationListen接口的bd
    • 发布早期的监听器

缘起: 继注册了发布事件的bd后 spring加载流程refresh之initApplicationEventMulticaster(),继续注册监听器

registerListeners

/**
 * 注册监听器
 */
registerListeners();

在发布事件的时候会从这里注册的监听器中去获取

protected void registerListeners() {
	/**
	 * getApplicationListeners就是获取applicationListeners
	 * 是通过applicationListeners(listener)添加的
	 * 放入applicationListeners中
	 */
	for (ApplicationListener listener : getApplicationListeners()) {
		getApplicationEventMulticaster().addApplicationListener(listener);
	}

	/**
	 * 从容器中获取所有实现了ApplicationListener接口的bd的bdName
	 * 放入applicationListenerBeans
	 *
	 */
	String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
	for (String listenerBeanName : listenerBeanNames) {
		getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
	}

	/**
	 * 这里先发布早期的监听器
	 */
	Set earlyEventsToProcess = this.earlyApplicationEvents;
	this.earlyApplicationEvents = null;
	if (earlyEventsToProcess != null) {
		for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
			getApplicationEventMulticaster().multicastEvent(earlyEvent);
		}
	}
}

通过addApplicationListener(listen)注册监听器

其中listen为实现ApplicationListen接口的bd,且该bd不需要注册进容器

AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(Test.class);
// 注册监听器
context.addApplicationListener(listen);
// 注册配置类
context.register(Test.class);
// 刷新上下文
context.refresh();

自定义实现ApplicationListen接口的bd

接口编程式实现监听器

发布早期的监听器

这里最后一步还会发布早期的事件,默认为空
spring加载流程refresh之registerListeners()_第1张图片

你可能感兴趣的:(spring源码)