Spring Framework之监听器的使用

本文详细介绍了Spring框架的事件机制,包括默认的ContextRefreshedEvent等四大事件,以及ApplicationContextEvent和ApplicationEvent接口。还探讨了如何自定义Spring事件和监听器,通过接口编程式实现(ApplicationListener、GenericApplicationListener、SmartApplicationListener)和@EventListener注解式实现。此外,文章还讨论了监听器的同步与异步执行,特别是如何利用@Async实现监听器的异步调用。
摘要由CSDN通过智能技术生成

spring的事件

spring默认的事件

ContextRefreshedEvent

容器完成初始化后调用finishRefresh()时会发布ContextRefreshedEvent事件

protected void finishRefresh() {
        this.clearResourceCaches();
        this.initLifecycleProcessor();
        this.getLifecycleProcessor().onRefresh();
        this.publishEvent((ApplicationEvent)(new ContextRefreshedEvent(this)));
        LiveBeansView.registerApplicationContext(this);
    }
ContextStartedEvent

需要手动调用start()方法,发布ContextStartedEvent事件

public void start() {
        this.getLifecycleProcessor().start();
        this.publishEvent((ApplicationEvent)(new ContextStartedEvent(this)));
    }
ContextStoppedEvent

需要手动调用stop()方法,发布ContextStoppedEvent事件

public void stop() {
        this.getLifecycleProcessor().stop();
        this.publishEvent((ApplicationEvent)(new ContextStoppedEvent(this)));
    }
ContextClosedEvent

需要手动调用close()destroy()方法时,发布ContextClosedEvent事件

public void stop() {
        this.getLifecycleProcessor().stop();
        this.publishEvent((ApplicationEvent)(new ContextStoppedEvent(this)));
    }

spring事件接口

ApplicationContextEvent 与 ApplicationEvent

造轮子得先看轮子长啥样,先看看spring默认的事件怎么写的
ContextClosedEvent.java

public class ContextClosedEvent extends ApplicationContextEvent {
    public ContextClosedEvent(ApplicationContext source) {
        super(source);
    }
}

ApplicationContextEvent.java

public abstract class ApplicationContextEvent extends ApplicationEvent {
    public ApplicationContextEvent(ApplicationContext source) {
        super(source);
    }

    public final ApplicationContext getApplicationContext() {
        return (ApplicationContext)this.getSource();
    }
}

ApplicationEvent.java

public abstract class ApplicationEvent extends EventObject {
    private static final long serialVersionUID = 7099057708183571937L;
    private final long timestamp = System.currentTimeMillis();

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

    public final long getTimestamp() {
        return this.timestamp;
    }
}

发现事件最终是EventObject,但是spring的监听

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值