Spring Event 是什么?

本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。

简述

在本文中,介绍Spring Events,这是一种将应用程序中的组件松散耦合的方法,以实现更好的设计和信息的轻松交换。

Spring 框架事件是部分 Spring 框架,Spring 的事件通知机制是一项很有用的功能,同时也是最容易被忽视的特点,使用事件机制开发人员可以将相互耦合的代码解耦,从而方便功能的修改与添加。

原理

Spring Event 框架使用的是监听器模式。

监听器模式

监听者模式包含了一个监听者 Listener 与之对应的事件 Event,还有一个事件发布者 EventPublish ,过程就是EventPublish 发布一个事件,被监听者捕获到,然后执行事件相应的方法。

监听器模式与观察者模式
  • 监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法。
  • 观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数。
监听器模式介绍

三个概念

  • 事件源
  • 事件对象
  • 事件监听器
    在这里插入图片描述
    事件传播流程示意图:
    在这里插入图片描述
分类

Spring 提供以下标准事件:

序号 Spring内置事件 描述
1 ContextRefreshedEvent 初始化或刷新ApplicationContext时,将发布此事件。也可以使用ConfigurableApplicationContext接口上的refresh() 方法来引发此事件。
2 ContextStartedEvent 使用ConfigurableApplicationContext接口上的start() 方法启动ApplicationContext时,将发布此事件。您可以轮询数据库,也可以在收到此事件后重新启动任何已停止的应用程序。
3 ContextStoppedEvent 当使用ConfigurableApplicationContext接口上的stop() 方法停止ApplicationContext时,将发布此事件。
4 ContextClosedEvent 使用ConfigurableApplicationContext接口上的close() 方法关闭ApplicationContext时,将发布此事件。它不能刷新或重新启动。
5 RequestHandledEvent 这是一个特定于Web的事件,告诉所有Bean HTTP请求已得到服务。

Spring 的事件处理是单线程的,因此,如果事件已发布,则直到并且除非所有接收者都收到消息,否则流程将被阻塞并且流程将不会继续。因此,如果要使用事件处理,则在设计应用程序时应格外小心。

例子

简单的准则需要遵循:

  • 事件应扩展 ApplicationEvent 接口
  • 发布者应该注入到 ApplicationEventPublisher 对象
  • 监听器应实现 ApplicationListener 接口
自定义事件

创建一个简单 CustomerRegistrationEvent 的存储客户数据:

public class CustomerRegistrationEvent {

    private String name;

    public CustomerRegistrationEvent(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
自定义事件监听器

该监听器应监听正在发布的事件,并在服务发布的事件引起关注时采取相应的措施。

@Component
public class CustomerRegistrationEventListener {

    @EventListener
    void handleRegistration(CustomerRegistrationEvent event){
        System.out.println("Registration event got triggered for customer::  " + event.getName());
    }
}

Spring 4.2 中,它不需要您实现 ApplicationListener 或类似的东西,但是只需一个简单的 @EventListener 注释就可以将其声明为 Listener

Spring 将为 ApplicationListener 事件创建一个实例,该实例的类型取自方法参数。一类中带注释的方法的数量没有限制-我们可以将所有相关的事件处理程序归为一类。

发布事件

将创建具有以下任务的发布者:

  • 它将创建一个事件对象。
  • 它将向所有正在收听此事件的人发布该事件。

需要 ApplicationEventPublisher 在代码中发布给定事件。

@Autowired
private ApplicationEventPublisher publisher;

public void publishEvent(final String name) {
    publisher.publishEvent(new CustomerRegistrationEvent(name));
}

总结

在这篇文章中,对 Spring 框架事件进行了介绍。学习了如何创建自定义事件,以及如何发布 Spring 事件 。

参考资料

Spring Event事件通知机制

Spring Events

Event Handling in Spring

Better application events in Spring Framework 4.2(Spring Framework 4.2中更好的应用程序事件)

Spring Events

Spring Application Events

发布了56 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/feng_xiaoshi/article/details/103803782
今日推荐