Spring 事件机制

1,417 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

Spring事件机制提供了一个事件监听和订阅的实现,本身通过观察者模式实现,主要用于逻辑与逻辑的解偶,服务与服务的解偶,在微服务中,我们为了减少依赖,通常采用一些事件机制配合消息队列来进行服务信息的传递。

观察者模式

简单回顾下观察者模式吧,观察者模式定义一对多的依赖关系,一个主题对象可以被多个观察者同时监听,当主题对象发生变化时,使得观察者会得到通知并被自动更新,属于行为型设计模式。观察者模式主要包含四个角色:

  • 抽象主题:被观察的对象的抽象,定义了一系列的新增,修改,删除观察者的方法
  • 具体主题:具体的被观察者,当内部行为发生了变化,会通知观察者
  • 抽象观察者:定义了观察的通知方法
  • 具体观察者:当得到状态通知时,会自动做出响应

Spring的标准事件

内置事件描述
ContextRefreshedEventApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生
ContextStartedEvent当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
ContextStoppedEvent使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
ContextClosedEvent当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启
RequestHandledEventweb-specific 事件,告诉所有 bean HTTP 请求已经被服务

定义事件

所有的监听对象都是围绕着事件而来,通常事件定义,只需要继承ApplicationEvent抽象类即可

public abstract class DomainEvent extends ApplicationEvent {
    protected DomainEvent(Object source) {
        super(source);
    }
}

事件发布

事件发布主要使用ApplicationContext的publishEvent的方法,主要在业务发生时用

applicationContext.publishEvent(event);

事件监听

做为观察者具体实现,事件监听有多种实现方式

  • 注解方式
    @EventListener
    public void dealMessage(DomainEvent event){
        // 观察者响应逻辑
    }
  • 实现ApplicationListener接口
    @Override
    public void onApplicationEvent(DomainEvent event){
        // 观察者响应逻辑
    }

在日常开发中,我们经常会使用到Spring boot中的一个监听事件ApplicationReadyEvent,我们可以通过ApplicationListener监听到应用启动后,可以进行一些业务操作等,使用非常方便。