【springboot】ApplicationListener用法及源码

用法

方法一:继承ApplicationListener

  1. 传递事件
    继承于ApplicationEvent
public class ForDebuggerEvent extends ApplicationEvent {

    public ForDebuggerEvent(Object source) {
        super(source);
    }

    public void executeEvent() {
        System.out.println("ForDebuggerEvent executeEvent");
    }

}
  1. 监听器
public class ForDebuggerEventListener implements ApplicationListener<ForDebuggerEvent> {

    @Override
    public void onApplicationEvent(ForDebuggerEvent event) {
        event.executeEvent();
    }
}

  1. 事件推送
SpringUtil.publishEvent(new ForDebuggerEvent(new HashMap<>()));

方法二:@EventListener

  1. 传递事件
    和方法一相同,继承于ApplicationEvent
public class ErrorLogEvent extends ApplicationEvent {

    public ErrorLogEvent(Object source) {
        super(source);
    }

}
  1. 监听器
public class LogEventListener {

    @Async
    @Order
    @EventListener(ErrorLogEvent.class)
    public void errorLog(ErrorLogEvent event) {
        Object source = event.getSource();
        if(source instanceof ErrorLog){
            ErrorLog errorLog = (ErrorLog) source;
            log.info("[错误日志] => {}", JSON.toJSONString(errorLog));
        }
    }
}

  1. 事件推送
SpringUtil.publishEvent(new ErrorLogEvent(errorLog));

源码

方法一

SpringUtil.publishEvent

从SpringUtil出发,由于实现了ApplicationContextAware,可以获取到ApplicationContext
【springboot】ApplicationListener用法及源码_第1张图片

applicationContext.publishEvent

event为传递事件。获取到监听事件控制器,执行事件处理
【springboot】ApplicationListener用法及源码_第2张图片

getApplicationEventMulticaster().multicastEvent

通过event获取符合的ApplicationListener
【springboot】ApplicationListener用法及源码_第3张图片

getApplicationListeners

在这里判断event是否是被注册到IOC的Listener监听的对象,返回符合要求的Listener,这里匹配到两个,一个我们自定义,一个spring默认
。具体代码分析略
【springboot】ApplicationListener用法及源码_第4张图片
【springboot】ApplicationListener用法及源码_第5张图片
【springboot】ApplicationListener用法及源码_第6张图片

invokeListener => listener.onApplicationEvent回调

传递Listener,最终回调listener.onApplicationEvent(event);
【springboot】ApplicationListener用法及源码_第7张图片
【springboot】ApplicationListener用法及源码_第8张图片

方法二

与方法一的区别

整体执行逻辑和方法一相同,唯一的区别就是Listener由于我们没有继承ApplicationListener,而是通过注解。
当执行listener.onApplicationEvent时候,这里的Listener是通过适配器模式,创建的ApplicationListenerMethodAdapter对象
内部字段有我们自定义的Listener的beanName,method为监听的自定义方法
【springboot】ApplicationListener用法及源码_第9张图片
【springboot】ApplicationListener用法及源码_第10张图片

最终通过反射执行Method方法

【springboot】ApplicationListener用法及源码_第11张图片
完成注解自定义方法的回调
【springboot】ApplicationListener用法及源码_第12张图片

你可能感兴趣的:(springboot源码解析,spring,boot,java,后端)