[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在业务中的应用

目录
相关文章
|
6天前
|
Java 应用服务中间件 数据库连接
Java 新手入门:Spring Boot 启动揭秘,小白也能秒懂的超详细指南
Java 新手入门:Spring Boot 启动揭秘,小白也能秒懂的超详细指南
24 2
|
8天前
|
Java Spring
Java 项目工程搭建 --创建子模块(Spring Initializr)
Java 项目工程搭建 --创建子模块(Spring Initializr)
35 3
|
6天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
3天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
1天前
|
安全 前端开发 Java
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择。依赖注入使对象管理交由Spring容器处理,实现低耦合高内聚;AOP则分离横切关注点如事务管理,增强代码模块化。Spring还提供MVC、Data、Security等模块满足多样需求,并通过Spring Boot简化配置与部署,加速微服务架构构建。掌握这些核心概念与工具,开发者能更从容应对挑战,打造卓越应用。
6 1
|
6天前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
6天前
|
安全 Java 开发者
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
14 1
|
17天前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
71 2
|
23天前
|
Java Spring
idea新建spring boot 项目右键无package及java类的选项
idea新建spring boot 项目右键无package及java类的选项
34 5
|
21天前
|
存储 Java Serverless
Java Spring Boot应用如何实现推送代码到指定仓库并自动部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。