# SpringEvent **Repository Path**: naclnezn/spring-event ## Basic Information - **Project Name**: SpringEvent - **Description**: SpringEvent - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-08-10 - **Last Updated**: 2025-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Event(Spring 事件) # 一、简介 ## 1.1 Spring Event Spring的事件监听(也叫事件驱动)是观察者模式的一种实现 只要是观察者模式,就含有主题(针对该主题的事件),发布者(发布主题或事件),订阅者(监听主题的人)。 有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作。 作用: 使用事件机制我们可以将相互耦合的代码解耦,从而方便功能拓展和调整。 ## 1.2 事件机制实现方式 实现Spring事件机制主要有4个类: 1. ApplicationEvent:事件,每个实现类表示一类事件,可携带数据。 2. ApplicationListener:事件监听器,用于接收事件处理事件。 3. ApplicationEventMulticaster:事件管理者,用于事件监听器的注册和事件的广播。 4. ApplicationEventPublisher:事件发布者,委托ApplicationEventMulticaster完成事件发布 ### 1.2.1 ApplicationEvent ApplicationEvent:应用事件,职责为定义业务 Spring 提供了一个继承于 java.util.EventObject 类的 ApplicationEvent 的的抽象类 并提供了应用上线文事件的抽象实现 ApplicationContextEvent 下面的容器关闭、刷新、启动、停止等容器事件以及RequestHandledEvent(http 请求处理完成事件) 可自定义事件(只需要实现ApplicationEvent 抽象类定义有参构造函数即可,source表示事件源,(可按照自己的需求制定) eg:[LoginEvent.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2FLoginEvent.java) ### 1.2.2 ApplicationListener ApplicationListener:事件监听器,职责为处理事件广播器发布的事件。 Spring提供了继承于java.util.EventListener接口的应用监听器接口 eg:[LoginEventMessageNoticeListener.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2Fcomponent%2FLoginEventMessageNoticeListener.java) ### 1.2.3 ApplicationEventMulticaster 事件广播器,职责为将EventPubsher(事件发布者)发布的event 广播给事件EventListener(事件监听器)。 Spring提供了默认的实现SimpleApplicationEventMulticaster,如果用户没有配置自定义事件广播器, 则会默认使用SimpleApplicationEventMulticaster作为事件广播器。在容器刷新的过程中会实例化、初始化事件广播器。 ### 1.2.4 ApplicationEventPublisher 事件发布者,职责为发布事件 spring的ApplicationContext 本来就实现了ApplicationEventPublisher接口 因此应用上下文本来就是一个事件发布者,在AbstractApplicationContext中实现了事件发布的业务。 eg: [LoginEventPublisher.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2FLoginEventPublisher.java) ## 二、监听 事件监听器默认是同步阻塞的 ## 2.1 异步时间监听 默认情况下,事件监听器使用当前线程同步处理事件 当前线程阻塞直到事件处理完成,在一些事件监听器处理事件比较长的场景是不适合的,这时候我们可以使用异步进行处理。 启动类: ```@EnableAsync``` [AsynEventListener.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2Fcomponent%2FAsynEventListener.java) ## 3.2 条件事件监听 Spring 还提供了根据特定标准有条件地处理事件的功能。这使我们能够很好地控制监听器对事件的处理。 [ConditionalEventListener.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2Fcomponent%2FConditionalEventListener.java) ## 2.3 事务事件监听 Spring 事件可以和事务一起使用 在 Spring 4.2+,引入了 @TransactionalEventListener 对 @EventListener 进行增强。以便能够控制在事务的时候Event事件的处理方式。 [TransactionalEventsListener.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2Fcomponent%2FTransactionalEventsListener.java) ## 2.4 监听事件执行顺序 默认情况下,多个监听器对同一个事件的处理事未定的,我们可以使用 @Order 注解指定执行顺序。 [OrderEventListener.java](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2Fcomponent%2FOrderEventListener.java) ## 2.5 泛型事件 我们也可以使用泛型来实现通用的事件处理。定义一个通用的事件类型,以处理不同类型的事件数据 [generic](src%2Fmain%2Fjava%2Fcom%2Fnacl%2Fspringevent%2Fgeneric) 下的文件