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等。开发人员可以根据自己的需求,定义自己的事件类型,并添加自定义属性。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值