「这是我参与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监听到应用启动后,可以进行一些业务操作等,使用非常方便。
近期评论