Spring事件机制

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

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

观察者模式

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

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

Spring的标准事件

内置事件 描述
ContextRefreshedEvent ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生
ContextStartedEvent 当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
ContextStoppedEvent 使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
ContextClosedEvent 当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启
RequestHandledEvent web-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监听到应用启动后,可以进行一些业务操作等,使用非常方便。