private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {try {listener.onApplicationEvent(event);
最后就使用对应的ApplicationListener进行接收和处理就行了,那么ApplicationListener是什么时候注册的呢?
如何添加ApplicationListener?
- 直接添加,使用content.addApplicationListener(上面实例中有使用);
- 将自定义的ApplicationListener注册为一个Bean,Spring再初始化Bean之后会添加,具体代码在ApplicationListenerDetector#postProcessAfterInitialization,判断一个Bean如果是ApplicationListener,则也是使用context.addApplicationListener添加;
- 使用注解@EventListener,在初始化Bean之后,会在EventListenerMethodProcessor中进行处理和添加;
EventListenerMethodProcessor中):
private void processBean(final String beanName, final Class<?> targetType) {....// 获取public 且有@EventListener的方法AnnotatedElementUtils.findMergedAnnotation(method, EventListener.class));...ApplicationListener<?> applicationListener = factory.createApplicationListener(beanName, targetType, methodToUse);// 添加监听器context.addApplicationListener(applicationListener); }
Spring内建事件- ContextRefreshedEvent: Spring应用上下文就绪事件;
- ContextStartedEvent: Spring应用上下文启动事件;
- ContextStopedEvent: Spring应用上下文停止事件;
- ContextClosedEvent: Spring应用上下文关闭事件;
public abstract class SpringApplicationEvent extends ApplicationEvent
事件对象改为SpringApplicationEvent,事件源为SpringApplication(Spring事件源为Context);底层发布事件还是使用
SimpleApplicationEventMulticaster 对象,不过有点需要说明的是,Spring Boot 1.4开始,SpringApplication和ApplicationContext使用的都是
SimpleApplicationEventMulticaster实例,但是两者属于不同的对象(1.0 ~ 1.3版本是同一个对象);
事件回顾:
public class EventBootstrap {public static void main(String[] args) {new SpringApplicationBuilder(Object.class).listeners(event -> {System.out.println("事件对象:"+ event.getClass().getSimpleName()+ " ,事件源:" + event.getSource().getClass().getSimpleName());}).web(WebApplicationType.NONE).run(args).close();}}
运行结果:事件对象:ApplicationContextInitializedEvent ,事件源:SpringApplication事件对象:ApplicationPreparedEvent ,事件源:SpringApplication事件对象:ContextRefreshedEvent ,事件源:AnnotationConfigApplicationContext事件对象:ApplicationStartedEvent ,事件源:SpringApplication事件对象:ApplicationReadyEvent ,事件源:SpringApplication事件对象:ContextClosedEvent ,事件源:AnnotationConfigApplicationContext
从结果可以看出,事件对象类型和事件源,以及事件发布顺序 。【深入浅出Spring/SpringBoot 事件监听机制】
推荐阅读
- 瞬间几千次的重复提交,我用Spring Boot+Redis扛住了
- 程序员必看:Spring Boot+Vue.js+FastDFS实现分布式图片服务器!
- 深入浅出为什么你的网页需要CSP?【前端篇】
- Springboot整合https原来这么简单
- 深入浅出React.js 性能分析
- Spring Boot 一个接口同时支持 form 表单、form-data、json 优雅写法
- Spring Session 原理分析
- 程序员云旅游:10分钟带你走完SpringMVC里一次HTTP请求处理之路
- 深入浅出微服务架构:一分钟让你轻松上手Docker容器
- Java程序员只会CRUD连Spring事务传播机制都不懂?