Date: 10/01/2022
Week13
概念:事件驱动
SimpleEvent关系类
ApplicationEventMulticaster
Spring的refresh()方法事件周期
1#事件
2#监听器
3#多播器
4#事件源
//程序入口
MyClassPathXmlApplicationContext.MyClassPathXmlApplicationContext(String... configLocations){}
ClassPathXmlApplicationContext(String... configLocations) throws BeansException {}
ClassPathXmlApplicationContext.ClassPathXmlApplicationContext(String... configLocations) throws BeansException {}
this(configLocations, true, null);
#重复方法, enter
this(configLocations, true, null);
refresh();
#spring核心代码#refresh();
//Spring源码核心,所有初始化信息的加载过程在全部都在这里。
1#事件
// Initialize event multicaster for this context.
// 初始化事件监听多路广播器
initApplicationEventMulticaster();
2#监听器
// 在所有注册的bean中查找listener bean,注册到消息广播器中
registerListeners();
3#多播器
// 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
finishRefresh();
// 发布最终事件
// 新建ContextRefreshedEvent事件对象,将其发布到所有监听器。
publishEvent(new ContextRefreshedEvent(this));
// 多播applicationEvent到适当的监听器
getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);
4#事件源
// 将event多播到所有适合的监听器。如果event不是ApplicationEvent实例,会将其封装成PayloadApplicationEvent对象再进行多播
((AbstractApplicationContext) this.parent).publishEvent(event, eventType);
补充部分:
AbstractAutowireCapableBeanFactory
创建Bean对象,
instanceWrapper = createBeanInstance(beanName, mbd, args);
AbstractApplicationContext
创建多播器
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
addSingleton(beanName, singletonObject);
APPLICATION_EVENT_MULTICASTER_BEAN_NAME
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
// 将映射关系添加到单例对象的高速缓存中
this.singletonObjects.put(beanName, singletonObject);
// 移除beanName在单例工厂缓存中的数据
this.singletonFactories.remove(beanName);
// 移除beanName在早期单例对象的高速缓存的数据
this.earlySingletonObjects.remove(beanName);
// 将beanName添加到已注册的单例集中
this.registeredSingletons.add(beanName);
}
}