BeanDefinitionRegistryPostProcessor--- Spring源码从入门到精通(二十八)
ApplicationListener:监听容器中发布的事件,事件驱动模型的开发。
写一个监听器来监听某个事件(ApplicationEvent)
吧监听器加入到容器
只要容器中有相关事件发布,就能监听到:A、ContextRefreshedEvent容器刷新完成,所有bean都完全创建,会发布这个事件。B、ContextClosedEvent关闭容器会发布这个事件。(spring事件)
自己如何发布事件。
/**
* @author keying
*/
@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
/**
* 当容器中发布此事件,方法会得到触发
*
* @param event
*/
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("收到的事件:" + event);
}
}
@Test
public void test() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
applicationContext.publishEvent(new ApplicationEvent("自定义发布事件") {});
applicationContext.close();
}
从打印中可以看到,监听到三个事件,两个spring容器刷新和容器close的事件,一个是自定义事件。
里面有个方法publishEvent(new ContextRefreshedEvent)
事件发布流程:A、获取事件多波器(派发器): getApplicationEventMulticaster。B、multicastEvent派发事件。C、获取到所有的ApplicationListener循环。若有executor支持进行异步派发。否则同步的方式直接执行listener方法。InvokeListener()。
返回listener回调onApplicationEvent方法。
自己调用publshEvent方法。
refresh方法刷新。
initApplicationEventMulticaster方法。
先判断容器中是否有id = applicationEventMulticaster的组件。没有就直接new 一个,并且加入容器中,就可以在其他组件派发事件时候,自动注入这个applicationEventMulticaster。
从容器中按ApplicationListener类型找到的listener加入到派发器。