[Java Framework] [Spring] Spring Event / 事件的使用 一: ApplicationEvent

简介: [Java Framework] [Spring] Spring Event / 事件的使用 一: ApplicationEvent

简介

Spring Event 主要是为了解耦代码使用, 对于事件弱相关业务可以添加到事件里面执行
比如: 会员购买会员卡之后会员的状态变更, 发送邮件或者站内信提醒。

JDK的Util包里抽象了事件驱动,有兴趣的朋友可以自行去看下相关类的定义。Spring事件模型ApplicationEvent是基于JDK里的事件模型,

🧲[官方文档] Additional Capabilities of the ApplicationContext

🧲[相关文章] Spring Event / 事件的使用 二: Transactional Event

方法 / 步骤

一: 定义事件实体

  • 📄OrderPayEvent.java
/**
 * Description:
 *
 * @author: YangGC
 */
public class OrderPayEvent extends ApplicationEvent {

    /**
     * 当前订单对象
     * @param source
     */
    private Order order;

    public OrderPayEvent(Object source) {
        super(source);
        this.order = (Order) source;
    }

    public Order getOrder() {
        return order;
    }
}

二: 定义监听器

定义监听者的方式,Spring提供了两种,一种是接口方式,一种是注解方式。

2.1: 接口方式

这里定义了两个监听者,实现泛型接口ApplicationListener类型为我们刚定义的OrderPayedEvent这里加上Order注解,是因为我们有多个监听者,有此业务场景中可能会有顺序的要求!
  • 📄OrderPayedPrinterListener.java
@Component
@Order(1)
public class OrderPayedPrinterListener implements ApplicationListener<OrderPayedEvent> {

    @Override
    public void onApplicationEvent(OrderPayedEvent event) {
        System.out.printf("【线程 - %s 】订单成功成功:第一步,打印小票%n", Thread.currentThread().getName());
    }
}
  • 📄OrderPayedSendMessageListener.java
@Component
@Order(2)
public class OrderPayedSendMessageListener implements ApplicationListener<OrderPayedEvent> {

    @Override
    public void onApplicationEvent(OrderPayedEvent event) {
        System.out.printf("【线程 - %s 】订单成功成功:第二步,发送通知商品中心添加库存%n", Thread.currentThread().getName());
    }
}

2.1: 注解方式

注解方式是不会有排序功能的,如果你有业务有需要排序,那么建议换成接口方式

@Component
public class OrderPayListener {

    @EventListener(classes = {OrderPayedEvent.class})
    public void sendTips(OrderPayedEvent event) {
        System.out.printf("【线程 - %s 】订单成功成功:发送用户订单支付消息%n", Thread.currentThread().getName());
    }

    @EventListener(classes = {OrderPayedEvent.class})
    public void reward(OrderPayedEvent event) {
        System.out.printf("【线程 - %s 】订单成功成功:奖励业务%n", Thread.currentThread().getName());
    }
}

三: 发送事件

  • 📄 ShoppingMallConsumerApplication.java
@SpringBootApplication
public class ShoppingMallConsumerApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(ShoppingMallConsumerApplication.class);
    }

    //这里注入 应用上下文,可以注入 applicationEventPublisher
    @Resource
    ApplicationContext context;
//    @Resource
//    ApplicationEventPublisher applicationEventPublisher;
    @Override
    public void run(String... args) throws Exception {
        context.publishEvent(new OrderPayEvent(new Order(100L,"酸菜鱼")));
    }
}
  • 打印结果
【线程 - main 】订单成功成功:第一步,打印小票
【线程 - main 】订单成功成功:第二步,发送通知商品中心添加库存

异步处理

ApplicationEvent对异步支持是怎么样的呢?

只要在启动类上加上@EnableAsync,在监听器类加上@Async

  • 📄 ShoppingMallConsumerApplication.java
@EnableAsync
@SpringBootApplication
public class ShoppingMallConsumerApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(ShoppingMallConsumerApplication.class);
    }

    //这里注入 应用上下文,可以注入 applicationEventPublisher
    @Resource
    ApplicationContext context;
//    @Resource
//    ApplicationEventPublisher applicationEventPublisher;
    @Override
    public void run(String... args) throws Exception {
        context.publishEvent(new OrderPayEvent(new Order(100L,"酸菜鱼")));
    }
}
  • 打印结果
【线程 - task-2 】订单成功成功:第二步,发送通知商品中心添加库存
【线程 - task-1 】订单成功成功:第一步,打印小票

参考资料 & 致谢

[1] Spring事件,ApplicationEvent在业务中的应用

目录
相关文章
|
4月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
4月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
259 8
|
5月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
2715 58
|
5月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
476 3
|
6月前
|
前端开发 Java 开发者
Java新手指南:在Spring MVC中使用查询字符串与参数
通过结合实际的需求和业务逻辑,开发者可以灵活地利用这些机制,为用户提供更丰富而高效的Web应用体验。
207 15
|
6月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
1238 0
|
7月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
808 1
|
7月前
|
JSON 前端开发 Java
Java新手指南:如何在Spring MVC中处理请求参数
处理Spring MVC中的请求参数是通过控制器方法中的注解来完成的。这些注解包括 `@RequestParam`, `@PathVariable`, `@ModelAttribute`, `@RequestBody`, `@RequestHeader`, `@Valid`, 和 `@RequestMapping`。使用这些注解可以轻松从HTTP请求中提取所需信息,例如URL参数、表单数据或者JSON请求体,并将其转换成Java对象以供进一步处理。
570 17
|
7月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
218 2
|
8月前
|
IDE Java 数据库连接
解决Java环境中无法识别org.mybatis.spring.annotation.MapperScan的问题。
祝你好运,在这场MyBatis的魔法冒险中获得胜利!记住,魔法书(官方文档)永远是你最好的朋友。
720 18