您现在的位置是:首页 >技术杂谈 >Spring 事件相关知识ApplicationEvent网站首页技术杂谈
Spring 事件相关知识ApplicationEvent
Spring 事件相关知识ApplicationEvent
Spring 事件驱动模型是 Spring 框架中的一个组成部分,它提供了一种基于事件的方法来驱动应用程序的演化。Spring 事件驱动模型基于观察者模式 (Observer Pattern) 和发布 - 订阅模式 (Publish-Subscribe Pattern),它允许应用程序中的组件之间相互通信,并且可以在需要的时候自动触发事件以通知其他组件。
Spring Framework中的事件驱动模型包括以下几个关键元素:
事件:一个Java类,它封装了与应用程序中某个状态相关的信息,例如用户注册、订单创建等。事件类必须继承自ApplicationEvent抽象类。可以定义自己的事件类型,并根据需要添加自定义属性。
事件发布器(Event Publisher):负责发送事件。在Spring中,事件发布器是一个接口ApplicationEventPublisher,它定义了一个方法publishEvent(),可以将事件发布到所有已注册的监听器。
事件监听器(Event Listener):用于监听事件的对象,负责处理事件。在Spring中,事件监听器是一个接口ApplicationListener,它定义了一个方法onApplicationEvent()。只要事件被发布,所有已注册的监听器都会收到该事件并执行相应的操作。
事件源:事件发生的地方。在Spring中,事件源通常是一个Bean。当该Bean的状态发生变化时,它会创建一个相应的事件并将其传递给事件发布器。
使用Spring的事件驱动模型,开发人员可以轻松实现松散耦合的架构,同时也更容易进行单元测试。此外,事件驱动模型还可以提高代码的可读性和可维护性。
事件工作流程
Spring 事件驱动模型的工作流程如下:
当目标组件发生事件时,事件发布者会发布该事件。
事件监听器会检测到该事件,并触发相应的方法。
事件订阅者会检测到该事件,并触发相应的方法。
如果事件发布者和事件订阅者之间存在关联,那么事件发布者会将事件传递给事件订阅者。
如果事件订阅者没有关联,那么事件发布者会将事件广播给所有注册的事件订阅者。
通过使用 Spring 事件驱动模型,应用程序中的组件可以相互通信,并且在需要的时候自动触发事件以通知其他组件。这种模型可以用于实现许多不同的应用程序功能,例如用户界面组件之间的通信、数据库事件驱动等。
相关类
ApplicationListener
编写一个监听器(ApplicationListener的实现类)来监听某个事件(ApplicationEvent及其子类)
public class ApplicationEventDemoListenter implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("++++++++++"+event);
}
}
这样我们就可以获取到 ApplicationEvent及其子类所有的事件
ApplicationEventDemoListenter 交由spring管理,xml或者注解的方式都可以
也可以用下面的注解方式
@EventListener(classes = {ApplicationEvent.class})
public void listen(ApplicationEvent event){
System.out.println("UserService ...监听到的事件:"+event);
}
ApplicationEvent 我们可以发布自己的事件
ApplicationEvent 事件基类, EventObject是java提供的一个类
我们自定义事件时一般继承该类:
public class SpringEventDemo extends ApplicationEvent {
public SpringEventDemo(Object source) {
super(source);
}
public SpringEventDemo(Object source, Clock clock) {
super(source, clock);
}
}
监听:
public class SpringEventDemoListener implements ApplicationListener<SpringEventDemo> {
@Override
public void onApplicationEvent(SpringEventDemo event) {
System.out.println("=========================="+event);
}
}
事件发布:
context.publishEvent(new SpringEventDemo(“我们自己定义的事件”));
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
context.start();
context.publishEvent(new SpringEventDemo("我们自己定义的事件"));
System.in.read();
}
ApplicationEventPublisher
public interface ApplicationEventPublisher {
/**
* 发布事件
* @param event 事件
*/
void publishEvent(ApplicationEvent event);
}
ApplicationEventMulticaster事件管理、分发器。
ApplicationEventMulticaster统一定义公共行为,
AbstractApplicationEventMulticaster抽象类处理公共逻辑。SimpleApplicationEventMulticaster默认分发器,只需要执行具体的分发逻辑。
supportEvent方法检查事件是否需要被处理。
ApplicationContext 继承了 ApplicationEventPublisher 因此可以发布事件
Spring框架中提供了多种事件类型,常用的几个事件类型如下:
ContextRefreshedEvent:当ApplicationContext被初始化或刷新时发布。例如,当应用程序启动时或热部署时。
ContextStartedEvent:当ApplicationContext启动时发布,即调用其start()方法。
ContextStoppedEvent:当ApplicationContext停止时发布,即调用其stop()方法。
ContextClosedEvent:当ApplicationContext关闭时发布,即调用其close()方法。
RequestHandledEvent:在Web应用程序中,当Http请求已经被处理并且响应已经生成时发布。
除了上述常用的事件类型,Spring还提供了其他一些事件类型,例如ServletRequestHandledEvent、SessionCreatedEvent、SessionDestroyedEvent等。开发人员可以根据自己的需求,定义自己的事件类型,并添加自定义属性。