一步一步教你使用Spring框架中的事件订阅发布

简介: 1. 前言Java 开发中有些逻辑是这样的,完成了A操作,再继续B操作,在继续C操作。这么描述好像有点不清楚。打个比方把,你吃晚饭,通知你老婆(女友)来收碗筷,然后通知你的线上兄弟告诉他们你回来了准备开黑。至于你老婆(女友)来不来收拾无所谓,反正你告诉她了。至于你兄弟你也是通知他们,人家也不一定组你,万一他们正在跟一个一拖三的carry大佬玩的正起劲儿呢。2. 事件的概念吃晚饭就是一个所谓的事件。触发了随后的两个操作,他们只存在因果关系。但是它们互不干扰,各自为政。一个完整的事件由 事件源、事件发布、事件监听 组成。 接下来我们聊聊 Spring 中的事件。3. Spring 中的
  1. 前言

Java 开发中有些逻辑是这样的,完成了A操作,再继续B操作,在继续C操作。这么描述好像有点不清楚。打个比方把,你吃晚饭,通知你老婆(女友)来收碗筷,然后通知你的线上兄弟告诉他们你回来了准备开黑。至于你老婆(女友)来不来收拾无所谓,反正你告诉她了。至于你兄弟你也是通知他们,人家也不一定组你,万一他们正在跟一个一拖三的carry大佬玩的正起劲儿呢。

  1. 事件的概念

吃晚饭就是一个所谓的事件。触发了随后的两个操作,他们只存在因果关系。但是它们互不干扰,各自为政。一个完整的事件由 事件源、事件发布、事件监听 组成。 接下来我们聊聊 Spring 中的事件。

  1. Spring 中的事件

Spring 框架中使用了大量的事件机制,比如 Spring Boot 的启动。方便起见我们新建一个 Spring Boot 工程。然后跟着我一步步的来进行事件的操作。

3.1 声明事件
声明一个事件。通过继承 org.springframework.context.ApplicationEvent 来编写事件。时间里定义好事件推送到监听器需要执行的方法,当然也可以在监听器里写触发逻辑。我们来声明一下:
package cn.felord.boot.event;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

/**

  • 吃饭事件

*

  • @author dax
  • @since 2019 /7/8 21:54

*/
@Slf4j
public class EatEvent extends ApplicationEvent {

private Boolean eatFinished;


/**
 * Instantiates a new Eat event.
 *
 * @param eatFinished 吃饭是否完成的信号 这里也可以传递其他资源
 */
public EatEvent(Boolean eatFinished) {
    super(eatFinished);
    this.eatFinished = eatFinished;
}

/**
 * 这里会由对应监听器{@link ApplicationListener<EatEvent>} 执行
 *
 * 叫女友收拾碗筷.
 */
public void callGirlFriend() {
    log.info("亲爱的! 我吃完饭了,来收拾收拾吧");
}

/**
 * 这里会由对应监听器{@link ApplicationListener<EatEvent>} 执行
 * 呼叫兄弟开黑.
 */
public void callBrothers() {
    log.info("兄弟们! 我吃完饭了,带我开黑");
}

/**
 * 吃晚饭的信号.
 *
 * @return the boolean
 */
public Boolean isEatFinished() {
    return this.eatFinished;
}

}
复制代码
3.2 事件发布
发布事件通过实现事件发布接口 org.springframework.context.ApplicationEventPublisher 或者其门面接口 org.springframework.context.ApplicationEventPublisherAware, 推荐门面接口,里面要定义一个主动推送事件的方法如下面的 refreshEvent 方法,实际代理了 ApplicationEventPublisher 执行其 publishEvent 方法:

package cn.felord.boot.event;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;

/**

  • 发布事件 发布事件通过实现 事件发布接口 {@link ApplicationEventPublisher}
  • 或者通过门面接口{@link ApplicationEventPublisherAware}
  • 推荐按照下面的实现方式,而且该类需要注册为spring bean

*

  • @author dax
  • @since 2019 /7/8 22:04

*/
@Slf4j
public class EatEventPublisherAware implements ApplicationEventPublisherAware {

private ApplicationEventPublisher applicationEventPublisher;

private ApplicationEvent eatEvent;

public EatEventPublisherAware(ApplicationEvent eatEvent) {
    this.eatEvent = eatEvent;
}

@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
    this.applicationEventPublisher = applicationEventPublisher;
}

/**
 * 发送事件动作   事件的动作需要主动触发  调用此方法进行事件触发
 * 代理{@link ApplicationEventPublisher#publishEvent(ApplicationEvent)}
 */
public void refreshEvent() {
    log.info("发送事件中……");
    this.applicationEventPublisher.publishEvent(eatEvent);
}

}
复制代码
3.3 事件监听
事件监听用来监听事件以触发相关的逻辑。通过实现 org.springframework.context.ApplicationListener 来实现事件的监听。特别注意泛型E,如果不指定手机号码出售平台事件将可以接收任何事件,尽量职责单一。

package cn.felord.boot.event;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;

/**

  • {@link EatEvent}事件的专属事件监听器
  • @author dax
  • @since 2019/7/8 22:11

*/
@Slf4j
public class EatEventListener implements ApplicationListener {

@Override
public void onApplicationEvent(EatEvent eatEvent) {
    //如果吃完饭了
    if (eatEvent.isEatFinished()) {
        eatEvent.callGirlFriend();
        log.error("来自母老虎的咆哮:滚犊子");
        eatEvent.callBrothers();
        log.error("太晚了,我们已经满了,明天带你");
        log.info("还是关注一下 【码农小胖哥】 学习点新知识吧");
    }
}

}
复制代码
3.4 注入Spring IoC
将上面三个类注入 Spring 容器中,这里我们采用了 JavaConfig 方式,看起来更明显。

package cn.felord.boot.config;

import cn.felord.boot.event.EatEvent;
import cn.felord.boot.event.EatEventListener;
import cn.felord.boot.event.EatEventPublisherAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**

  • 这三个一定要配置成bean

*

  • @author dax
  • @since 2019/7/8 22:16

*/
@Configuration
public class EventConfig {

@Bean
public ApplicationEvent eatEvent() {
    return new EatEvent(true);
}

@Bean
public ApplicationListener eatEventListener() {
    return new EatEventListener();
}

@Bean
public ApplicationEventPublisherAware eatEventPublisherAware(ApplicationEvent eatEvent) {
    return new EatEventPublisherAware(eatEvent);
}

}
复制代码

  1. 测试

这里就大功告成了,那么如何使用呢,执行事件发布器的发布方法 refreshEvent 就行了,事件监听器监听到事件会自动响应。我们来写一个单元测试。

package cn.felord.boot;

import cn.felord.boot.event.EatEventPublisherAware;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
public class EventSpringApplicationTests {
@Resource
private EatEventPublisherAware eatEventPublisherAware;

@Test
public void contextLoads() {

    eatEventPublisherAware.refreshEvent();
}

}
复制代码
运行一下,入图

到此你应该就学会使用 Spring 事件了,这样写出来的代码逼格更高。还能提现你对 Spring 框架的一些理解。当然还有一种更加简单的、基于注解的方式,这里不再阐述。

目录
相关文章
|
13天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
25天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
38 4
|
22天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
32 0
|
17天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
38 1
Spring 框架:Java 开发者的春天
|
9天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
24 2
|
8天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
53 1
|
16天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
23天前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
24天前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
|
27天前
|
Java 数据库连接 数据库
让星星⭐月亮告诉你,SSH框架01、Spring概述
Spring是一个轻量级的Java开发框架,旨在简化企业级应用开发。它通过IoC(控制反转)和DI(依赖注入)降低组件间的耦合度,支持AOP(面向切面编程),简化事务管理和数据库操作,并能与多种第三方框架无缝集成,提供灵活的Web层支持,是开发高性能应用的理想选择。
35 1
下一篇
无影云桌面