深入浅出Spring/SpringBoot 事件监听机制( 二 )


private void doInvokeListener(ApplicationListener listener, ApplicationEvent event) {try {listener.onApplicationEvent(event);最后就使用对应的ApplicationListener进行接收和处理就行了,那么ApplicationListener是什么时候注册的呢?
如何添加ApplicationListener?

  1. 直接添加,使用content.addApplicationListener(上面实例中有使用);
  2. 将自定义的ApplicationListener注册为一个Bean,Spring再初始化Bean之后会添加,具体代码在ApplicationListenerDetector#postProcessAfterInitialization,判断一个Bean如果是ApplicationListener,则也是使用context.addApplicationListener添加;
  3. 使用注解@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应用上下文关闭事件;
Spring Boot事件Spring Boot事件是在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 事件监听机制】


推荐阅读