Spring ApplicationEvent 使用

简介: Spring ApplicationEvent 使用

Spring ApplicationEvent 使用

ApplicationEvent为Spring的事件基类,可通过@EventListener或实现ApplicationListener接口进行监听

监听及触发事件

自定义事件

import org.springframework.context.ApplicationEvent;

public class CustomAnnotationEvent extends ApplicationEvent {
    private static final long serialVersionUID = -4180050946434009635L;
    /**
     * 类型
     */
    private String type;
    /**
     * 构造方法
     *
     * @param source 事件源
     * @param type   类型
     */
    public CustomAnnotationEvent(Object source, String type) {
        super(source);
        this.type = type;
    }
    /**
     * 获取类型
     *
     * @return 获取类型
     */
    public String getType() {
        return type;
    }
}

抛出事件

//spring注入
@Autowired
private ApplicationContext applicationContext;
...
CustomAnnotationEvent event = new CustomAnnotationEvent(this, "annotation");
applicationContext.publishEvent(event);

监听事件

@EventListener
public void listenCustomAnnotationEventAll(CustomAnnotationEvent event) {
    log.info("listenCustomAnnotationEventAll:{}", JSONUtil.toJsonStr(event));
}
监听事件及抛出事件的类需为spring管理的bean

其它

@EventListener(condition = "#event.type eq 'anycAnnotation' ")
@Async
public void listenCustomAnnotationAsyncEvent(CustomAnnotationEvent event) {
    log.info("listenCustomAnnotationEvent1:{}", JSONUtil.toJsonStr(event));
}
  • 异步事件:在方法上增加@Async注解则会将事件处理转为异步处理,异常及耗时不会影响抛出事件的方法,需在启动类中增加@EnableAsync开启此功能
  • 条件过滤:@EventListener注解中condition为SpEL表达式,可访问参数中的属性进行判断是否处理此事件
  • 同时监听多个事件:可使用@EventListene注解中classes条件扩充监听的事件
@EventListener(classes = { CustomAnnotationEvent.class, CustomAsyncErrorEvent.class,CustomAsyncEvent.class, CustomMetohEvent.class})
public void handleMultipleEvents(ApplicationEvent event) {
    log.info("handleMultipleEvents:{}", JSONUtil.toJsonStr(event));
}

标准事件

事件类 说明
ContextRefreshedEvent ApplicationContext初始化或刷新时发布
ContextStartedEvent 手动调用start()方法时发布
ContextStoppedEvent 手动调用stop()方法时发布
ContextClosedEvent ApplicationContext关闭时发布
另还有很多内置事件可通过查看ApplicationEvent子类来查看,例如SessionCreationEvent,KafkaEvent,RedisKeyspaceEvent等

参考资料

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#context-functionality-events

https://www.baeldung.com/spring-context-events

目录
相关文章
|
消息中间件 安全 JavaScript
小家Spring】从Spring中的(ApplicationEvent)事件驱动机制出发,聊聊【观察者模式】【监听者模式】【发布订阅模式】【消息队列MQ】【EventSourcing】...(中)
小家Spring】从Spring中的(ApplicationEvent)事件驱动机制出发,聊聊【观察者模式】【监听者模式】【发布订阅模式】【消息队列MQ】【EventSourcing】...(中)
|
Java Spring
[Java Framework] [Spring] Spring Event / 事件的使用 一: ApplicationEvent
[Java Framework] [Spring] Spring Event / 事件的使用 一: ApplicationEvent
112 0
|
消息中间件 前端开发 安全
小家Spring】从Spring中的(ApplicationEvent)事件驱动机制出发,聊聊【观察者模式】【监听者模式】【发布订阅模式】【消息队列MQ】【EventSourcing】...(上)
小家Spring】从Spring中的(ApplicationEvent)事件驱动机制出发,聊聊【观察者模式】【监听者模式】【发布订阅模式】【消息队列MQ】【EventSourcing】...(上)
小家Spring】从Spring中的(ApplicationEvent)事件驱动机制出发,聊聊【观察者模式】【监听者模式】【发布订阅模式】【消息队列MQ】【EventSourcing】...(上)
|
消息中间件 设计模式 安全
小家Spring】从Spring中的(ApplicationEvent)事件驱动机制出发,聊聊【观察者模式】【监听者模式】【发布订阅模式】【消息队列MQ】【EventSourcing】...(下)
小家Spring】从Spring中的(ApplicationEvent)事件驱动机制出发,聊聊【观察者模式】【监听者模式】【发布订阅模式】【消息队列MQ】【EventSourcing】...(下)
|
Java Spring
Spring(22)——ApplicationEvent
22 ApplicationEvent Spring允许我们在ApplicationContext中发布ApplicationEvent事件,然后对应的ApplicationListener可以用来监听对应的事件。
1530 0
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
197 2
|
17天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
35 1
SpringBoot入门(7)- 配置热部署devtools工具
|
29天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
40 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
12天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
28 5