重生之 SpringBoot3 入门保姆级学习(18、事件驱动开发解耦合)

重生之 SpringBoot3 入门保姆级学习(18、事件驱动开发解耦合)

  • 5、SpringBoot3 核心
    • 5.1 原始开发
    • 5.2 事件驱动开发

5、SpringBoot3 核心

5.1 原始开发


  • LoginController
package com.zhong.bootcenter.controller;import com.zhong.bootcenter.service.AccountService;
import com.zhong.bootcenter.service.CouponService;
import com.zhong.bootcenter.service.SysService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @ClassName : LoginController* @Description :* @Author : zhx* @Date: 2024-06-12 15:26*/
@RestController
public class LoginController {@AutowiredAccountService accountService;@AutowiredCouponService couponService;@AutowiredSysService sysService;@GetMapping("/login")public String Login(@RequestParam("username") String username, @RequestParam("password") String password) {// 业务处理登录System.out.println("业务处理完成......");// 1、账户服务:      自动签到加积分// 2、优惠卷服务:    随机发放优惠卷// 3、系统服务:      登记用户的信息accountService.addAccountScore(username);couponService.sendCoupon(username);sysService.SysUser(username);return username;}
}
  • AccountService
package com.zhong.bootcenter.service;import org.springframework.stereotype.Service;/*** @ClassName : AccountService* @Description :* @Author : zhx* @Date: 2024-06-12 15:30*/
@Service
public class AccountService {public void addAccountScore(String username) {System.out.println(username + " 用户积分+1");}
}
  • CouponService
package com.zhong.bootcenter.service;import org.springframework.stereotype.Service;/*** @ClassName : CouponService* @Description :* @Author : zhx* @Date: 2024-06-12 15:33*/
@Service
public class CouponService {public void sendCoupon(String username) {System.out.println(username + " 发了一张优惠价");}
}
  • SysService
package com.zhong.bootcenter.service;import org.springframework.stereotype.Service;/*** @ClassName : SysService* @Description :* @Author : zhx* @Date: 2024-06-12 15:35*/
@Service
public class SysService {public void SysUser(String username) {System.out.println( "记录了 " + username + " 的信息");}
}
http://localhost:8080/login?username=%22xiaozhong%22&password=%22123456%22

image-20240612155331320

image-20240612155247885

5.2 事件驱动开发


设计模式应该是:对新增开发,对修改关闭。

  • LoginController 登录接口
package com.zhong.bootcenter.controller;import com.zhong.bootcenter.entity.UserEntity;
import com.zhong.bootcenter.event.EventPublisher;
import com.zhong.bootcenter.event.LoginSuccessEvent;
import com.zhong.bootcenter.service.AccountService;
import com.zhong.bootcenter.service.CouponService;
import com.zhong.bootcenter.service.SysService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @ClassName : LoginController* @Description :* @Author : zhx* @Date: 2024-06-12 15:26*/
@RestController
public class LoginController {@AutowiredEventPublisher eventPublisher;@GetMapping("/login")public String Login(@RequestParam("username") String username, @RequestParam("password") String password) {// 业务处理登录System.out.println("业务处理完成......");// 1、账户服务:      自动签到加积分// 2、优惠卷服务:    随机发放优惠卷// 3、系统服务:      登记用户的信息// TODO 发送事件// 1、创建事件信息LoginSuccessEvent event = new LoginSuccessEvent(new UserEntity(username, password));// 2、发送事件eventPublisher.sendEvent(event);return username;}
}
  • UserEntity 用户类
package com.zhong.bootcenter.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;/*** @ClassName : UserEntity* @Description :* @Author : zhx* @Date: 2024-06-12 16:01*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {private String username;private String password;
}
  • EventPublisher 事件发送器
package com.zhong.bootcenter.event;import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;/*** @ClassName : EventPublisher* @Description :* @Author : zhx* @Date: 2024-06-12 15:58*/
@Service
public class EventPublisher implements ApplicationEventPublisherAware {/*** 底层发事件使用的组件,SpringBoot会通过 ApplicationEventPublisherAware 接口自动注入给我们* 事件是广播出去的,所有监听这个事件的监听器都会收到*/ApplicationEventPublisher applicationEventPublisher;/*** 所有事件都可以发送* @param event*/public void sendEvent(ApplicationEvent event) {// 调用底层 API 发送事件applicationEventPublisher.publishEvent(event);}/*** 会被自动调用,把真正发事件的底层组件给我们注入进来* @param applicationEventPublisher*/@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}
}
  • LoginSuccessEvent 登录成功监听
package com.zhong.bootcenter.event;import com.zhong.bootcenter.entity.UserEntity;
import org.springframework.context.ApplicationEvent;/*** @ClassName : LoginSuccessEvent* @Description :   登录成功事件,所有事件都推荐继承 ApplicationEvent* @Author : zhx* @Date: 2024-06-12 16:00*/
public class LoginSuccessEvent extends ApplicationEvent {public LoginSuccessEvent(UserEntity source) {super(source);}
}
  • AccountService 模拟用户积分 +1
package com.zhong.bootcenter.service;import com.zhong.bootcenter.entity.UserEntity;
import com.zhong.bootcenter.event.LoginSuccessEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;/*** @ClassName : AccountService* @Description :* @Author : zhx* @Date: 2024-06-12 15:30*/
@Service
public class AccountService {@EventListenerpublic void onEvent(LoginSuccessEvent loginSuccessEvent) {System.out.println("===== AccountService =====感知到事件" + loginSuccessEvent);UserEntity source = (UserEntity) loginSuccessEvent.getSource();addAccountScore(source.getUsername());}public void addAccountScore(String username) {System.out.println(username + " 用户积分+1");}
}
  • CouponService 模拟给用户发放优惠卷
package com.zhong.bootcenter.service;import com.zhong.bootcenter.entity.UserEntity;
import com.zhong.bootcenter.event.LoginSuccessEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;/*** @ClassName : CouponService* @Description :* @Author : zhx* @Date: 2024-06-12 15:33*/
@Service
public class CouponService {@EventListenerpublic void onEvent(LoginSuccessEvent loginSuccessEvent) {System.out.println("===== CouponService =====感知到事件" + loginSuccessEvent);UserEntity source = (UserEntity) loginSuccessEvent.getSource();sendCoupon(source.getUsername());}public void sendCoupon(String username) {System.out.println(username + " 发了一张优惠价");}
}
  • SysService 模拟记录用户登录
package com.zhong.bootcenter.service;import com.zhong.bootcenter.entity.UserEntity;
import com.zhong.bootcenter.event.LoginSuccessEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;/*** @ClassName : SysService* @Description :* @Author : zhx* @Date: 2024-06-12 15:35*/
@Service
public class SysService {@EventListenerpublic void onEvent(LoginSuccessEvent loginSuccessEvent) {System.out.println("===== SysService =====感知到事件" + loginSuccessEvent);UserEntity source = (UserEntity) loginSuccessEvent.getSource();SysUser(source.getUsername());}public void SysUser(String username) {System.out.println("记录了 " + username + " 的信息");}
}
http://localhost:8080/login?username=%22xiaozhong%22&password=%22123456%22

image-20240612162058455

image-20240612161704787

注意:默认触发顺序是按照字母排序,可以通过 @Order(number) 注解调整顺序,number 数字越低优先级越高。如:

package com.zhong.bootcenter.service;import com.zhong.bootcenter.entity.UserEntity;
import com.zhong.bootcenter.event.LoginSuccessEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;/*** @ClassName : SysService* @Description :* @Author : zhx* @Date: 2024-06-12 15:35*/
@Service
public class SysService {@Order(1)@EventListenerpublic void onEvent(LoginSuccessEvent loginSuccessEvent) {System.out.println("===== SysService =====感知到事件" + loginSuccessEvent);UserEntity source = (UserEntity) loginSuccessEvent.getSource();SysUser(source.getUsername());}public void SysUser(String username) {System.out.println("记录了 " + username + " 的信息");}
}

image-20240612162722903

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/349193.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯软件测试第十五届蓝桥杯模拟赛1期题目解析

PS 需要第十五界蓝桥杯模拟赛1期功能测试模板、单元测试被测代码、自动化测试被测代码请加🐧:1940787338 备注:15界蓝桥杯省赛软件测试模拟赛1期 题目1 功能测试用例1(测试用例)(15分) 【前期准备】 按步…

阿里云运维第一步(监控):开箱即用的监控

作者:仲阳 这是云的时代,现在云计算已经在各行各业广泛的应用。但是上云对于大多数客户来说,依然有很大的学习成本,如下图仅是阿里云都有几百款产品,怎么选择?怎么用?对于客户来说都是问题。“…

五、LVS原理

目录 5.1 LVS 相关原理 5.1.1 LVS集群的体系结构以及特点 5.1.1.1 LVS简介 5.1.1.2 LVS体系结构 5.1.1.3 LVS相关术语 5.1.1.4 LVS工作模式 5.1.1.5 LVS调度算法 5.1.2 LVS-DR集群介绍 5.1.2.1 LVS-DR模式工作原理 5.1.2.2 LVS-DR模式应用特点 5.1.2.3 LVS-DR模式ARP抑制 5.1…

【论文阅读】-- Omnisketch:高效的多维任意谓词高速流分析

Omnisketch:高效的多维任意谓词高速流分析 摘要1 引言2 预备知识及相关工作3 OMNISKETCH:使用任意谓词估计频率3.1 Sketch S0:Count-Min with rid-sets 用于估计带有谓词的查询3.2 Sketch S1 (OmniSketch):…

WPF学习(1)--类与类的继承

在面向对象编程中,继承是一种机制,允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和方法。继承使我们能够创建一个通用类,然后根据需要扩展或修改它以创建更具体的类。以下是…

Vue3-滑动到最右验证功能

1、思路 1、在登录页面需要启动向右滑块验证 2、效果图 3、文章地址:滑动验证码的实现-vue-simple-verify 2、成分分析 1、由三块构成,分别是底部条、拖动条、拖动移动部分 2、底部条:整体容器,包括背景、边框和文字&#xf…

2024中国翻译行业发展报告

来源:中国翻译协会 近期历史回顾: 2024国内工商业储能市场研究报告.pdf 2023幸福企业白皮书.pdf 2024年欧亚地区移动经济报告.pdf 内容供应链变革 2023人工智能与首席营销官(CMO) AI科技对PC产业的影响.pdf 金融业数据应用发展报…

多应用对接企业微信授权和扫码登录

多应用对接企业微信授权和扫码登录是一种常见的企业级解决方案,它可以帮助企业实现统一的身份验证和管理,提升用户体验和安全性。本文将介绍如何实现多应用对接企业微信授权和扫码登录的方法和步骤。 # 第一步:注册企业微信开放平台应用 首…

批量文件重命名技巧:轻松替换删除文件夹名中的字母,实现高效文件管理新境界

在数字化时代,我们每天都会面对大量的文件和文件夹。无论是工作文档、学习资料还是个人收藏,文件命名的规范性都显得尤为重要。然而,手动一个一个去修改文件名,不仅耗时耗力,还容易出错。那么,有没有一种方…

Linux-黑马程序员

目录 一、前言二、初识Linux1、操作系统(1)硬件和软件(2)操作系统 2、Linux3、虚拟机4、FinalShell5、WSL6、虚拟机快照 三、Linux基础命令1、Linux的目录结构2、Linux命令入门(1)Linux命令基础格式&#x…

UDS诊断、整车控制器诊断、ECU刷写、TBOX测试、GW测试

需要以下资料的可以私信我 TBOX 深圳 涉及过T-BOX测试吗Ota升级涉及的台架环境是什么样的?上车实测之前有没有一个仿真环境台架环境都什么零部件T-BOX了解多少Linux和shell有接触吗 单片机uds诊断是在实车上座的吗 uds在实车上插的那口 诊断仪器是哪个车机有没…

ESP RainMaker®为企业提供AIoT云解决方案,启明云端乐鑫代理商

在AIoT的浪潮中,企业面临着前所未有的机遇与挑战。如何快速响应市场变化,开发出具有竞争力的智能产品?如何确保数据安全,同时实现高效的设备管理?这些问题,ESP RainMaker给出了答案。 ESP RainMaker是一个…

openh264 帧内预测编码过程源码分析

函数关系 说明: 可以看到完成帧内预测编码的核心函数就是 WelsMdI16x16、WelsMdI4x4、WelsMdI4x4Fast 、WelsMdIntraChroma 四个函数。 原理 WelsMdI16x16函数 功能:针对16x16像素块的帧内模式决策过程: 局部变量申明;根据宏块…

GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记,有一些简单的证明和原理,是根据李宏毅老师的课程整理的,下面有链接。本篇文章主要就是梳理基础的概念和训练过程,如果有什么问题的话也可以指出的。 李宏毅老师的课程链接 1.概述 GAN是…

Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

项目启动|鑫泓佳电子牵手盘古信息,迈向数字化转型新征程

随着科技的迅猛发展和数智化浪潮的推进,电子行业正经历着一场前所未有的深刻变革。在这场变革中,深圳市鑫泓佳电子有限公司(以下简称“鑫泓佳电子”)凭借其敏锐的市场洞察力和前瞻性的战略规划,一直保持在行业的前列。…

46-4 等级保护 - 网络安全等级保护概述

一、网络安全等级保护概述 原文:没有网络安全就没有国家安全 二、网络安全法 - 安全立法 中华人民共和国主席令 第五十三号 《中华人民共和国网络安全法》已于2016年11月7日由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过,并自2017年6月1日起正式…

MES系统助力制造业数字化转型

一、MES系统的定义和功能 MES(Manufacturing Execution System)即制造执行系统,是一种可层级化管理生产活动的软件系统。它可以实现对生产过程全面的监控、调度、控制和优化,提高生产的效率、质量和安全性。MES系统具有以下几个主…

图像生成新篇章:Stable Diffusion 3 Medium开源评析

摘要 在数字艺术与人工智能的交汇点上,Stable Diffusion 3(SD3)的开源无疑是一场技术革新的盛宴。就在3月份,我撰写了一篇博文,深入探讨了SD3的技术报告内容与介绍,文章发表在CSDN博客上,https:…

汽车EDI:BRP EDI项目案例

项目背景 BRP Inc.使用EDI(电子数据交换)来处理其与供应商、客户和合作伙伴之间的业务交流。通过EDI,BRP可以在各种业务流程中自动化数据交换,例如采购订单、发货通知、发票、付款和库存信息等,从而提高操作效率、降低…