Spring的事件机制

简介: Spring 容器提供了事件管理机制,Spring 容器内部很多节点都会发布事件,也支持自定义事件。


一、事件机制



事件机制是基于监听者设计模式的实现,监听者模式包括三个部分:

  • 事件源:具体事件源,用于发布事件
  • 事件对象:封装事件源对象和事件相关信息,用于在事件源和监听器之间传递信息
  • 事件监听器:监听事件,用于对事件进行处理

Spring 提供了 ApplicationEventPublisher 接口用于发布事件。

可以通过继承 ApplicationEvent 抽象类来定义事件对象。

可以通过实现 ApplicationListener 接口来定义事件监听器。

微信图片111.png


1. 发布事件


在项目中,先定义一个事件对象来封装事件传递的相关信息。

事件源实现 ApplicationEventPublisherAware 接口注入事件发布者。

使用 ApplicationEventPublisher 事件发布者发布事件。

// 事件对象
public class CustomEvent extends ApplicationEvent {
    private final String name;
    public CustomEvent(Object source, String name) {
        super(source);
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
// 事件源
@Component
public class CustomService implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher publisher;
    public void test() {
        CustomEvent event = new CustomEvent(this, "CodeArtist");
        publisher.publishEvent(event);
    }
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }
}


2. 监听事件


通过实现 ApplicationListener 接口定义一个监听器类,接口泛型指定事件对象。

泛型指定的事件对象决定了该监听器监听的事件。

@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        // Do something
    }
}

除了监听自定义事件外,也可以监听 Spring 内部发布的事件:

  • ApplicationStartedEvent
  • ApplicationReadyEvent
  • ApplicationFailedEvent
  • ApplicationStartingEvent

可以查看 ApplicationEvent 抽象类的子类来了解 Spring 提供了哪些事件。


3. 基于注解监听


在 Bean 类的方法上使用 @EventListener 注解可以更简单的监听事件。

通过方法参数上的事件对象来指定监听的事件。

也可以通过注解的 value/classes 属性来指定监听的事件对象。

@Component
public class CustomNotifier {
    @EventListener
    public void listener(CustomEvent event) {
        System.out.println("Annotation listener: " + event.getName());
    }
    @EventListener(CustomEvent.class)
    public void listener() {
        System.out.println("Annotation listener.");
    }
}


二、顺序监听



每个事件都可以定义多个监听器,默认情况下监听器执行的顺序是未知的。

可以使用 @Order 注解来指定监听器的权重,来确定监听器的执行顺序。

@Component
public class CustomNotifier {
    @Order(1)
    @EventListener
    public void listener1(CustomEvent event) {
        System.out.println("Order 1: " + event.getName());
    }
    @Order(2)
    @EventListener
    public void listener2(CustomEvent event) {
        System.out.println("Order 2: " + event.getName());
    }
    @Order(3)
    @EventListener
    public void listener3(CustomEvent event) {
        System.out.println("Order 3: " + event.getName());
    }
}


三、异步监听



默认监听器都是同步处理事件任务的,可以使用 @Async 注解来进行异步处理。

@Component
@EnableAsync
public class CustomNotifier {
    @Async
    @EventListener
    public void listenerAsync(CustomEvent event) {
        System.out.println("Async: " + event.getName());
    }
}


使用 @Async 注解需要 @EnableAsync 来启用 Spring 的异步功能。


四、附录



1. 常用注解


注解 描述
@EventListener 定义方法为监听事件的监听器
@Async 指定异步执行方法
@EnableAsync 启用异步执行功能


2. 示例代码


Gitee 仓库:

https://gitee.com/code_artist/spring

项目模块:

spring-ioc

示例路径:

cn.codeartist.spring.event


目录
相关文章
|
24天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
64 2
|
6天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
38 8
|
12天前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
29 4
|
17天前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
47 8
|
7月前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
64 0
|
4月前
|
Java 开发工具 Spring
Spring的Factories机制介绍
Spring的Factories机制介绍
82 1
|
4月前
|
Java Spring 供应链
Spring 框架事件发布与监听机制,如魔法风暴席卷软件世界,开启奇幻编程之旅!
【8月更文挑战第31天】《Spring框架中的事件发布与监听机制》介绍了Spring中如何利用事件发布与监听机制实现组件间的高效协作。这一机制像城市中的广播系统,事件发布者发送消息,监听器接收并响应。通过简单的示例代码,文章详细讲解了如何定义事件类、创建事件发布者与监听器,并确保组件间松散耦合,提升系统的可维护性和扩展性。掌握这一机制,如同拥有一把开启高效软件开发大门的钥匙。
50 0
|
5月前
|
安全 Java API
构建基于Spring Boot的REST API安全机制
构建基于Spring Boot的REST API安全机制
|
5月前
|
存储 设计模式 Java
Spring Boot中的事件溯源模式
Spring Boot中的事件溯源模式
|
6月前
|
Java 应用服务中间件 Spring
解析Spring Boot自动装配的原理与机制
解析Spring Boot自动装配的原理与机制
120 4