本文内容如有错误、不足之处,欢迎技术爱好者们一同探讨,在本文下面讨论区留言,感谢。
简述
在本文中,介绍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