【Spring】ApplicationListener 的介绍与使用

文章介绍了Spring中的事件驱动机制,主要讨论了ApplicationContext的内置事件,如ContextRefreshedEvent(初始化或刷新时触发)、ContextStartedEvent(启动时触发)、ContextStoppedEvent(停止时触发)和ContextClosedEvent(关闭时触发),以及如何通过实现ApplicationListener接口响应这些事件。此外,还阐述了如何创建和处理自定义事件,包括创建自定义事件类和事件监听器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

ApplicationListener 是监听 ApplicationContext 发出的事件响应,这是 Spring 提供的事件驱动机制。
ApplicationListener 有内置事件和自定义事件两种。内置事件主要是围绕 ApplicationContext 生命周期触发的,而自定义事件相当于是我们自己定义的事件。


内置事件

内置事件是在 ApplicationContext 初始化和生命周期过程中被触发,与 ApplicationListener 配合的是 ApplicationContextEvent,ApplicationContextEvent 分为以下几种:


ContextRefreshedEven【当 ApplicationContext 被初始化或刷新时触发】

当 ApplicationContext 被初始化或刷新时触发,这里的初始化是指 ApplicationContext 已经装配完成,所有的 Bean 都已经被实例化。而刷新是指在 ConfigurableApplicationContext 接口中使用 refresh()。ContextRefreshedEvent 事件通常在整个应用启动时触发一次。

代码如下:

@Component
public class ContextRefreshedEventApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 在ApplicationContext刷新完成后执行自定义操作
    }
}

ContextStartedEvent【当 ApplicationContext 启动时触发】

当 ApplicationContext 启动时触发,也可以手动使用 ConfigurableApplicationContext 接口调用 start 方法执行。

代码如下:

@Component
public class ContextStartedEventApplicationListener implements ApplicationListener<ContextStartedEvent> {
    @Override
    public void onApplicationEvent(ContextStartedEvent event) {
        // 在ApplicationContext启动时执行自定义操作
    }
}

ContextStoppedEvent【当 ApplicationContext 停止时触发】

当 ApplicationContext 停止时触发,也可以手动使用 ConfigurableApplicationContext 接口调用 stop 方法执行。

代码如下:

@Component
public class ContextStoppedEventApplicationListener implements ApplicationListener<ContextStoppedEvent> {
    @Override
    public void onApplicationEvent(ContextStoppedEvent event) {
        // 在ApplicationContext停止时执行自定义操作
    }
}

ContextClosedEvent【当 ApplicationContext 关闭时触发】

当 ApplicationContext 关闭时触发,也可以手动使用 ConfigurableApplicationContext 接口调用 close 方法执行。

代码如下:

@Component
public class ContextClosedEventApplicationListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 在ApplicationContext关闭时执行自定义操作
    }
}


自定义事件

创建一个 Event 事件类,继承 ApplicationEvent

@Setter
@Getter
public class StudentEvent extends ApplicationEvent {
    private String name;
    private int age;
    private int phone;

    public StudentEvent(ApplicationContext source) {
        super(source);
    }
}

创建接收事件类

@Component
public class StudentListener implements ApplicationListener<StudentEvent> {
    @Override
    public void onApplicationEvent(StudentEvent event) {

    }
}

创建发布事件

@Component
public class StudentListener implements ApplicationListener<StudentEvent> {
    @Override
    public void onApplicationEvent(StudentEvent event) {

    }
}




End


<think>我们是在讨论Spring框架中的ApplicationListener使用。根据引用内容,ApplicationListenerSpring提供的一个监听器接口,用于实现发布-订阅模式。当某个事件(ApplicationEvent)发布时,监听该事件的ApplicationListener会被触发。 在Spring Web项目中,我们可以通过以下步骤使用ApplicationListener: 1. **定义事件**:创建自定义事件类,继承ApplicationEvent。 2. **定义监听器**:创建类实现ApplicationListener接口,并指定监听的事件类型;或者使用@EventListener注解。 3. **发布事件**:在需要触发事件的地方,使用ApplicationContext发布事件。 下面我们结合代码示例来说明。 ### 步骤1:定义自定义事件 假设我们有一个用户注册成功的事件,我们可以这样定义: ```java public class UserRegisteredEvent extends ApplicationEvent { private String username; public UserRegisteredEvent(Object source, String username) { super(source); this.username = username; } public String getUsername() { return username; } } ``` ### 步骤2:定义监听器 有两种方式定义监听器: **方式一:实现ApplicationListener接口** ```java @Component public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> { @Override public void onApplicationEvent(UserRegisteredEvent event) { // 处理事件,例如发送欢迎邮件 System.out.println("Sending welcome email to: " + event.getUsername()); } } ``` **方式二:使用@EventListener注解(更简洁)** ```java @Component public class UserRegisteredListener { @EventListener public void handleUserRegisteredEvent(UserRegisteredEvent event) { // 处理事件 System.out.println("Sending welcome email to: " + event.getUsername()); } } ``` ### 步骤3:发布事件 在需要触发事件的地方(例如用户注册服务中),注入ApplicationContext并发布事件: ```java @Service public class UserService { @Autowired private ApplicationContext applicationContext; public void registerUser(String username) { // 注册用户的逻辑... System.out.println("User registered: " + username); // 发布用户注册事件 applicationContext.publishEvent(new UserRegisteredEvent(this, username)); } } ``` ### 注意事项 - 事件监听器默认是同步执行的,即发布事件的线程会等待所有监听器处理完成。如果需要异步执行,可以在监听器方法上添加`@Async`注解,并启用Spring的异步支持(在配置类上添加`@EnableAsync`)。 - 监听器可以通过实现`SmartApplicationListener`接口来指定监听多个事件或根据条件执行。 ### 在Web项目中的配置 确保Spring能够扫描到事件和监听器所在的包,通常通过`@ComponentScan`实现。在Spring Boot项目中,主类上默认有`@SpringBootApplication`注解,它包含了`@ComponentScan`。 ### 示例总结 通过以上步骤,我们实现了在用户注册成功后发布事件,然后由监听器处理发送欢迎邮件的逻辑。这样可以将业务逻辑解耦,使代码更加清晰。 §§相关问题§§ 1. Spring中的ApplicationListener和ApplicationEvent有什么关系? 2. 如何实现ApplicationListener的异步处理? 3. 除了自定义事件,Spring内置了哪些常用的事件? 4. 在Spring Boot中如何使用ApplicationListener? 5. 如何通过SmartApplicationListener实现更灵活的事件监听? 以上内容参考了提供的引用[^1][^2][^4][^5]。</think>在Spring Web项目中使用`ApplicationListener`实现监听器功能,主要涉及定义事件、创建监听器和发布事件三个核心步骤。以下是详细实现指南: --- ### 1. **定义自定义事件类** 创建继承`ApplicationEvent`的事件类,用于封装业务数据: ```java public class OrderCreateEvent extends ApplicationEvent { private String orderId; public OrderCreateEvent(Object source, String orderId) { super(source); this.orderId = orderId; } public String getOrderId() { return orderId; } } ``` --- ### 2. **实现事件监听器** #### 方式一:实现`ApplicationListener`接口 ```java @Component public class OrderEventListener implements ApplicationListener<OrderCreateEvent> { @Override public void onApplicationEvent(OrderCreateEvent event) { // 业务处理:发送通知、更新库存等 System.out.println("订单创建事件监听: 订单ID=" + event.getOrderId()); } } ``` #### 方式二:使用`@EventListener`注解(推荐) ```java @Component public class OrderEventListener { @EventListener public void handleOrderEvent(OrderCreateEvent event) { System.out.println("@EventListener监听: 订单ID=" + event.getOrderId()); } } ``` --- ### 3. **发布事件** 在业务逻辑中注入`ApplicationContext`并发布事件: ```java @Service public class OrderService { @Autowired private ApplicationContext applicationContext; public void createOrder(String orderId) { // 1. 创建订单核心逻辑 System.out.println("创建订单: " + orderId); // 2. 发布事件 applicationContext.publishEvent(new OrderCreateEvent(this, orderId)); } } ``` --- ### 4. **异步事件处理** 通过`@Async`实现异步监听(需启用异步支持): ```java @Configuration @EnableAsync // 启用异步支持 public class AsyncConfig { ... } @Component public class AsyncEventListener { @Async @EventListener public void asyncHandle(OrderCreateEvent event) { // 异步执行的耗时操作 System.out.println("异步处理订单事件: " + event.getOrderId()); } } ``` --- ### 关键机制说明 1. **事件传播** Spring会自动将事件传递给所有匹配的监听器,无需手动注册[^1][^5]。 2. **监听器优先级** 使用`@Order`注解控制执行顺序: ```java @EventListener @Order(1) // 数字越小优先级越高 public void highPriorityHandler(OrderCreateEvent event) { ... } ``` 3. **条件监听** 通过SpEL表达式过滤事件: ```java @EventListener(condition = "#event.orderId.startsWith('VIP')") public void handleVIPOrder(OrderCreateEvent event) { ... } ``` --- ### 实际应用场景 - **订单系统**:订单状态变更时触发库存更新、通知推送 - **用户服务**:用户注册后发送验证邮件、初始化账户 - **审计日志**:关键操作触发日志记录 > 提示:Spring内置了`ContextRefreshedEvent`(容器刷新)、`RequestHandledEvent`(请求完成)等事件,可直接监听[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值