| Event | Explanation |
|---|---|
| ContextRefreshedEvent | 在 ApplicationContext 初始化或刷新时发布 |
| ContextStartedEvent | 使用 ConfigurableApplicationContext 接口上的 start() 方法启动 ApplicationContext 时发布 |
| ContextStoppedEvent | 在通过使用 ConfigurableApplicationContext 接口上的 stop() 方法停止 ApplicationContext 时发布 |
| ContextClosedEvent | 在通过使用 ConfigurableApplicationContext 接口上的 close() 方法或通过 JVM 关闭挂钩关闭 ApplicationContext 时发布 |
| RequestHandledEvent | 一个特定于 Web 的事件,告诉所有 Bean 已为 HTTP 请求提供服务。此事件在请求完成后发布。此事件仅适用于使用 Spring 的 DispatcherServlet 的 Web 应用程序。 |
| ServletRequestHandledEvent | RequestHandledEvent 的子类,用于添加特定于 Servlet 的上下文信息 |
public class OrderCreateEvent extends ApplicationEvent {
@Getter
private Long id;
public OrderCreateEvent(Object source,Long id) {
super(source);
this.id=id;
}
}
@Service
@Slf4j
public class OrderService {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void submit() {
log.info("提交事件");
applicationEventPublisher.publishEvent(new OrderCreateEvent(this, 1001L));
log.info("提交事件完成");
}
}
@Service
@Slf4j
public class OrderConsumer {
@EventListener
public void listen(OrderCreateEvent event) {
log.info("订单id:{}",event.getId());
try {
Thread.sleep(5000);
log.info("订单处理完成...");
}catch (Exception e){
e.printStackTrace();
}
}
}
终端输出
2023-10-11 09:13:50.095 INFO 23628 --- [nio-8080-exec-1] com.vmware.service.OrderService : 提交事件
2023-10-11 09:13:50.096 INFO 23628 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer : 订单id:1001
2023-10-11 09:13:55.102 INFO 23628 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer : 订单处理完成...
2023-10-11 09:13:55.102 INFO 23628 --- [nio-8080-exec-1] com.vmware.service.OrderService : 提交事件完成
@Service
@Slf4j
public class OrderConsumer {
@EventListener
@Async
public void listen(OrderCreateEvent event) {
log.info("订单id:{}",event.getId());
try {
Thread.sleep(5000);
log.info("订单处理完成...");
}catch (Exception e){
e.printStackTrace();
}
}
}
@Async对监听方法进行修饰,并使用@EnableAsync开启异步处理终端输出
2023-10-11 09:18:55.400 INFO 22308 --- [nio-8080-exec-2] com.vmware.service.OrderService : 提交事件
2023-10-11 09:18:55.403 INFO 22308 --- [nio-8080-exec-2] com.vmware.service.OrderService : 提交事件完成
2023-10-11 09:18:55.409 INFO 22308 --- [ task-1] com.vmware.event.OrderConsumer : 订单id:1001
2023-10-11 09:19:00.413 INFO 22308 --- [ task-1] com.vmware.event.OrderConsumer : 订单处理完成...
@EventListener(condition = "")
@EventListener 和 @TransactionalEventListener 都有 condition 属性,可以用来判断事件的参数满足一定条件的时候执行监听事件我们可以通过 @Order 注解来控制监听器的执行顺序,该注解的值越小,执行的顺序越靠前。不过在异步事件中不建议使用它来控制顺序,因为那样意义不大
@Service
@Slf4j
public class OrderConsumer {
@EventListener
@Order(1)
public void listen(OrderCreateEvent event) {
log.info("订单id:{}", event.getId());
try {
Thread.sleep(5000);
log.info("订单处理完成...");
} catch (Exception e) {
e.printStackTrace();
}
}
@EventListener
@Order(2)
public void listen2(OrderCreateEvent event) {
log.info("发送邮件通知admin.");
}
}
终端输出
2023-10-11 09:27:37.895 INFO 8648 --- [nio-8080-exec-1] com.vmware.service.OrderService : 提交事件
2023-10-11 09:27:37.896 INFO 8648 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer : 订单id:1001
2023-10-11 09:27:42.902 INFO 8648 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer : 订单处理完成...
2023-10-11 09:27:42.903 INFO 8648 --- [nio-8080-exec-1] com.vmware.event.OrderConsumer : 发送邮件通知admin.
2023-10-11 09:27:42.903 INFO 8648 --- [nio-8080-exec-1] com.vmware.service.OrderService : 提交事件完成