Spring Boot 监听器Listeners详细教程(最新整理)

 更新时间:2025年07月15日 10:51:21   作者:twj_one  
SpringBoot监听器基于Spring事件机制,用于响应应用状态变化,内置事件涵盖启动、关闭等生命周期,支持自定义事件定义,本文给大家介绍Spring Boot 监听器Listeners详细教程,感兴趣的朋友一起看看吧

Spring Boot 监听器概述

Spring Boot 监听器(Listeners)基于 Spring Framework 的事件机制(ApplicationEvent 和 ApplicationListener),用于在应用生命周期或自定义事件触发时执行特定逻辑。它们提供了一种松耦合的方式响应应用状态变化,常用于初始化资源、监控应用状态、执行异步任务等。

概念

事件类型

  • 内置系统事件:
  • ContextRefreshedEvent: ApplicationContext初始化或刷新时触发
  • ContextStartedEvent: ApplicationContext启动后触发
  • ContextStoppedEvent: ApplicationContext停止后触发
  • ContextClosedEvent: ApplicationContext关闭后触发
  • ApplicationStartedEvent: Spring Boot应用启动后触发
  • ApplicationReadyEvent: 应用准备就绪时触发(推荐在此执行启动逻辑)
  • ApplicationFailedEvent: 启动失败时触发
  • 自定义事件: 继承ApplicationEvent创建特定业务事件

监听器类型

接口实现: 实现ApplicationListener
注解驱动: 使用@EventListener注解方法
SmartApplicationListener: 支持事件类型过滤和顺序控制
简单说就是:

  • 事件(Event): 继承 ApplicationEvent 的类,表示一个事件(如应用启动、关闭等)。
  • 监听器(Listener): 实现 ApplicationListener 接口、SmartApplicationListener接口或使用 @EventListener注解的组件,用于响应事件。
  • 事件发布(Publisher): 通过 ApplicationEventPublisher 发布事件。

最佳使用场景

自定义事件

步骤1:定义事件类

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:发布事件

@Service
public class OrderService {
    @Autowired
    private ApplicationEventPublisher eventPublisher;
    public void createOrder(Order order) {
        // 创建订单逻辑...
        eventPublisher.publishEvent(new OrderCreateEvent(this, order.getId()));
    }
}

事件监听

方式1:实现ApplicationListener接口

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
public class SystemStartupListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("=== 应用启动完成,执行初始化操作 ===");
        // 初始化业务数据...
    }
}
public class OrderCreateEventListener implements ApplicationListener<OrderCreateEvent> {
    @Override
    public void onApplicationEvent(OrderCreateEvent event) {
        System.out.println("=== 执行操作 ===");
        // 初始化业务数据...
    }
}

方式2:使用@EventListener注解

import org.springframework.context.event.EventListener;
import org.springframework.boot.context.event.ApplicationStartedEvent;
@Component
public class AnnotationBasedListener {
    @EventListener
    public void handleStartedEvent(ApplicationStartedEvent event) {
        System.out.println("=== 应用启动事件捕获 ===");
    }
}
@Component
public class AnnotationBasedListener {
    @EventListener
    public void handleStartedEvent(OrderCreateEvent event) {
        System.out.println("=== 执行操作 ===");
    }
}

方式3:实现SmartApplicationListener接口

@Slf4j
@Component
public class MyTask implements SmartApplicationListener {
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType == MyEvent.class || eventType == OrderCreateEvent.class;
    }
    @Override
    public int getOrder() {
        return 0;
    }
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof OrderCreateEvent) {
            log.info("监听到 OrderCreateEvent...");
        }
        if (event instanceof MyEvent) {
            log.info("监听到 MyEvent...");
            MyEvent myEvent = (MyEvent) event;
            System.out.println("时间:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());
        }
    }
}

高级配置

监听器顺序控制

    @EventListener
    @Order(Ordered.HIGHEST_PRECEDENCE) // 最高优先级
    public void handleOrderEvent(OrderCreateEvent event) {
        System.out.println("收到订单创建事件,订单ID:" + event.getOrderId());
        // 发送通知、更新统计...
    }

异步事件处理

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.initialize();
        return executor;
    }
}
// 可进行如下替换
@EventListener
@Async
public void asyncHandleEvent(MyEvent event) {
    // 异步执行
}

条件过滤

@EventListener(condition = "#event.orderId.startsWith('VIP')")
public void handleVipOrder(OrderCreateEvent event) {
    // 只处理VIP订单
}

到此这篇关于Spring Boot 监听器Listeners详细教程的文章就介绍到这了,更多相关Spring Boot 监听器Listeners内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • @ComponentScan在spring中无效的原因分析及解决方案

    @ComponentScan在spring中无效的原因分析及解决方案

    这篇文章主要介绍了@ComponentScan在spring中无效的原因分析及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot实现接口参数加密解密的示例代码

    SpringBoot实现接口参数加密解密的示例代码

    加密解密本身并不是难事,问题是在何时去处理?SpringMVC 中给我们提供了 ResponseBodyAdvice 和 RequestBodyAdvice,利用这两个工具可以对请求和响应进行预处理,非常方便。废话不多说,我们一起来学习一下
    2022-09-09
  • Spring boot按日切分spring boot的nohup.out日志文件的方法

    Spring boot按日切分spring boot的nohup.out日志文件的方法

    过大的日志文件维护起来存在诸多问题,所以最好是能够按日或按大小切分日志文件,下面小编给大家带来了Spring boot按日切分spring boot的nohup.out日志文件的方法,一起看看吧
    2018-08-08
  • Java11中基于嵌套关系的访问控制优化详解

    Java11中基于嵌套关系的访问控制优化详解

    Java(和其他语言)通过内部类支持嵌套类,要使其正常工作,需要编译器执行一些技巧,下面这篇文章主要给大家介绍了关于Java11中基于嵌套关系的访问控制优化的相关资料,需要的朋友可以参考下
    2022-01-01
  • Java 获取本机的IP与MAC地址实现详解

    Java 获取本机的IP与MAC地址实现详解

    这篇文章主要介绍了Java 获取本机的IP与MAC地址实现详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • javaweb中Filter(过滤器)的常见应用

    javaweb中Filter(过滤器)的常见应用

    这篇文章主要介绍了javaweb中Filter的常见应用,过滤器的使用方法,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • IDEA 2020代码提示忽略大小写的问题

    IDEA 2020代码提示忽略大小写的问题

    这篇文章主要介绍了IDEA 2020代码提示忽略大小写的问题,本文通过图文并茂的形式给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • IntelliJ IDEA 2019.2 x64的安装、应用与简单配置(图文)

    IntelliJ IDEA 2019.2 x64的安装、应用与简单配置(图文)

    这篇文章主要介绍了IntelliJ IDEA 2019.2 x64的安装、应用与简单配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • SpringBoot @ControllerAdvice 拦截异常并统一处理

    SpringBoot @ControllerAdvice 拦截异常并统一处理

    这篇文章主要介绍了SpringBoot @ControllerAdvice 拦截异常并统一处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详谈ServiceLoader实现原理

    详谈ServiceLoader实现原理

    下面小编就为大家带来一篇详谈ServiceLoader实现原理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论