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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!