- 上篇文章说了bean对象创建之前调用的两个方法:
BeanDefinitionRegistryPostProcessor--- Spring源码从入门到精通(二十八)
- 这篇文章主要介绍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的事件,一个是自定义事件。
- contextRefreshedEvent
- 容器创建,refresh()
- FinashRefresh,容器刷新完成最后一步。
里面有个方法publishEvent(new ContextRefreshedEvent)
事件发布流程:A、获取事件多波器(派发器): getApplicationEventMulticaster。B、multicastEvent派发事件。C、获取到所有的ApplicationListener循环。若有executor支持进行异步派发。否则同步的方式直接执行listener方法。InvokeListener()。
返回listener回调onApplicationEvent方法。
- 自定义发布事件
自己调用publshEvent方法。
事件派发器getApplicationEventMulticaster详解
refresh方法刷新。
initApplicationEventMulticaster方法。
先判断容器中是否有id = applicationEventMulticaster的组件。没有就直接new 一个,并且加入容器中,就可以在其他组件派发事件时候,自动注入这个applicationEventMulticaster。
- 容器中有哪些监听器
- refresh()方法里面有个注册所有的监听器registerListener。
从容器中按ApplicationListener类型找到的listener加入到派发器。