练习-使用ApplicationContext中事件发送以及AOP来实现代码解耦

news2024/11/26 12:29:30

案例要求

  • 将用户注册与用户发送消息之间进行解耦

实现

  • ApplicationContext接口

  • 具体文章见:BeanFactory与ApplicationContext_熵240的博客-CSDN博客
    • 创建事件类
      • package com.example;
        
        import org.springframework.context.ApplicationEvent;
        
        public class UserRegisteredEvent extends ApplicationEvent {
            public UserRegisteredEvent(Object source) {
                super(source);
            }
        }
        
    • 用户注册事件

      • package com.example;
        
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.context.ApplicationEventPublisher;
        import org.springframework.stereotype.Component;
        
        @Component
        public class Component01 {
            @Autowired
            ApplicationEventPublisher applicationEventPublisher;
        
            public void Event() {
                System.out.println("用户注册");
                applicationEventPublisher.publishEvent(new UserRegisteredEvent(this));
            }
        }
        
    • 发送信息事件

      • package com.example;
        
        import org.springframework.context.event.EventListener;
        import org.springframework.stereotype.Component;
        
        @Component
        public class Component02 {
            @EventListener
            public void EventLister(UserRegisteredEvent userRegisteredEvent) {
                System.out.println("发送短信");
            }
        }
        
    • 在启动类中运行用户注册事件

      • package com.example;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.context.ConfigurableApplicationContext;
        
        
        // Generated by https://start.springboot.io
        // 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
        @SpringBootApplication
        public class Application {
        
            public static void main(String[] args) {
        
                ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
                context.getBean(Component01.class).Event();
            }
        
        }
        
    • 运行结果如下:

  • AOP(面前切面编程)

    • 具体文章见: AOP- CSDN搜索
       
    • 创建AOP类
      • package com.example;
        
        import lombok.extern.slf4j.Slf4j;
        import org.aspectj.lang.ProceedingJoinPoint;
        import org.aspectj.lang.annotation.Around;
        import org.aspectj.lang.annotation.Aspect;
        import org.springframework.stereotype.Component;
        
        @Aspect
        @Component
        @Slf4j
        public class AOP {
            @Around("execution(* com.example.Component01.*(..))")
            public void Message(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
                proceedingJoinPoint.proceed();
                log.info("信息发送");
            }
        }
        
    • 创建目标对象所对应的类

      • package com.example;
        
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.stereotype.Component;
        
        @Component
        @Slf4j
        public class Component01 {
            public void Event() {
                log.info("用户注册");
            }
        }
        
    • 在启动类中调用目标对象的方法

      • package com.example;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.context.ConfigurableApplicationContext;
        
        
        // Generated by https://start.springboot.io
        // 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
        @SpringBootApplication
        public class Application {
        
            public static void main(String[] args) {
        
                ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
                context.getBean(Component01.class).Event();
            }
        
        }
        

区别

  • ApplicationContext中事件发送是一种松耦合的通信方式,适用于应用内部组件之间的消息传递,可以通过事件对象携带数据。
  • AOP是一种通过横切关注点的模块化来实现代码解耦的方式,适用于将横切逻辑(重复的逻辑功能)与业务逻辑(各自的功能逻辑)分离,实现代码重用和维护的目的。
  • 事件发送是一种事件驱动的方式,事件发布者不需要关心具体的监听者,而AOP是通过切面和通知来实现横切逻辑的织入,需要明确指定切面和通知的位置和规则。
  • 事件发送是一对多的关系,一个事件可以被多个监听者接收,而AOP是通过切面来定义在何处应用通知的规则,切面可以被多个目标对象共享。
  • 事件发送是在运行时动态触发事件,而AOP可以在编译期、运行期或加载期进行织入(不同的通知类型实现)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回溯算法解决分割回文串

回溯算法解分割回文串 力扣131 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出&#xff1…

婚恋相亲系统小程序源码金媒v10.0版 红娘系统pc端+h5端+公众好端统一后台管理模块

婚恋相亲系统小程序源码 金媒v10.0版本 红娘系统正版pc端+h5端+公众好端 统一后台管理 模块:vip模块,活动报名,红娘模块,上榜模块,婚恋文章,动态模块,红娘认领,认证模块(五种,有实名,手机,学历,收入,房子)等等。 多种模板 后台 管理员后台 红娘独立后台,…

Python 字符串格式化

视频版教程 Python3零基础7天入门实战视频教程 我们前面学到字符串拼接,如果简单的2,3个字符串拼接那还算好,如果大于3个变量的拼接,就比较麻烦。还有一点,就是字符串无法和和其他类型直接拼接,需要进行类型转换&…

地奥“畅依笙”革故鼎新,新品面市! 呵护肠胃 助力大健康!

根据平安健康发布的《2021国民肠道健康调研报告》,肠道问题逐渐年轻化,约90%的国人都会遇到肠道问题。我国肠胃终端产品持续热销,根据2021年淘宝天猫全年益生菌保健品/功能食品市场规模,销售额达63.2亿元;目前益生菌类…

Unity减少发布打包文件的体积——获取精灵图片的信息限制它的大小

一、起因 一个工程,打包成webGL且压缩成zip文件后,接近400M,后来把大的精灵图片设置最大尺寸,降低大小后,再次发布,zip文件缩减到250M 二、如何一键获得工程里面的精灵图片信息 三、获取精灵图片信息 1、…

智能工单系统的报修流程是怎样的?工单管理系统有什么作用?

“的修”智能工单管理系统适用于多个行业,包括学校、医院、酒店、企事业单位和社区物业。它基于微信小程序平台和APP开发,支持实现故障报修、报修状态查询以及服务评价等功能。用户可以轻松使用微信进行报修,以及查询报修的进度、状态和对服务…

【Linux从入门到精通】多线程 | 线程互斥(互斥锁)

上篇文章我们对线程 | 线程介绍&线程控制介绍后,本篇文章将会对多线程中的线程互斥与互斥锁的概念进行详解。同时结合实际例子解释了可重入与不被重入函数、临界资源与临界区和原子性的概念。希望本篇文章会对你有所帮助。 文章目录 引入 一、重入与临界 1、1 可…

网络安全深入学习第一课——热门框架漏洞(RCE-命令执行)

文章目录 一、RCE二、命令执行/注入-概述三、命令执行-常见函数四、PHP命令执行-常见函数1、exec:2、system3、passthru4、shell_exec5、反引号 backquote 五、PHP命令执行-常见函数总结六、命令执行漏洞成因七、命令执行漏洞利用条件八、命令执行漏洞分类1、代码层…

目标检测评估指标mAP:从Precision,Recall,到AP50-95【未完待续】

1. TP, FP, FN, TN True Positive 满足以下三个条件被看做是TP 1. 置信度大于阈值(类别有阈值,IoU判断这个bouding box是否合适也有阈值) 2. 预测类型与标签类型相匹配(类别预测对了) 3. 预测的Bouding Box和Ground …

C高级day5(Makefile)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.#----->把带参宏的参数替换成字符串 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX(a,b) a>b?a:b #define STR(n) #n int main(int argc, const char *argv…

sheetjs實現頁面的數據導出execl

概述 需要給頁面的table做一個數據導出功能,發現一個好用sheetjs工具 只需要簡單的js語法如下,就可以將table的數據導出來 function load(){var date new Date();date.setTime(date.getTime() (8 * 60 * 60 * 1000));var table document.getElementById("tab");v…

神领物流 day02-网关与支付 Spring Cloud Alibaba 微服务

课程安排 单token存在的问题双token三验证用户端token校验与鉴权对接三方支付平台分布式锁 1、场景说明 新入职的你加入了开发一组&#xff0c;也接到了开发任务&#xff0c;并且你也顺利的修复了bug&#xff0c;完成了快递员、司机的鉴权&#xff0c;现在的你已经对项目的业…

C++qt day8

1.用代码实现简单的图形化界面&#xff08;并将工程文件注释&#xff09; 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H //防止头文件冲突#include <QWidget> //父类的头文件class MyWidget : public QWidget //自定义自己的界面类&#xff0c;公共继承…

Linux vim的常见基本操作

目录 vim是一款多模式的编辑器 命令模式下&#xff1a; 用小写英文字母「h」、「j」、「k」、「l」&#xff0c;分别控制光标左、下、上、右移一格 gg&#xff1a;定位到代码第一行 nshiftg 定位到任意一行/最后一行 「 $ 」&#xff1a;移动到光标所在行的结尾 「 ^ 」&…

无涯教程-JavaScript - COLUMNS函数

描述 COLUMNS函数返回数组或引用中的列数。 语法 COLUMNS (array)争论 Argument描述Required/OptionalarrayAn array or array formula, or a reference to a range of cells for which you want the number of Columns.Required Notes COLUMNS(1:1)返回Excel中的列数,即…

字符串解码

题目链接 字符串解码 题目描述 注意点 s 由小写英文字母、数字和方括号 ‘[]’ 组成1 < s.length < 30s 保证是一个 有效 的输入s 中所有整数的取值范围为 [1, 300] 解答思路 利用栈先进后出的特点&#xff0c;将字符存储进栈中创建两个栈&#xff0c;一个数字栈&am…

照片批量处理 7000张

需求&#xff1a; 有6700照片导入系统&#xff1b; 系统只支持500张/每次&#xff1b; 6700 按机构分类复制提取出来&#xff1b; 分批次导入&#xff1b; 6700 分17份复制到对应文件夹中&#xff1b; 照片按照学号命名的&#xff1b; 20231715401.jpg 开始用bat脚本…

Matlab Simulink支持system generator插件

文章目录 前言一、System Generator 简介二、System Generator 特性三、System Generator 安装1、确定是否已安装 System Generator 工具2、vivado 卸载3、vivado 安装 四、解决版本不兼容问题五、使用 System Generator 前言 目前有在 Simulink 中开发完成后将其转换成 Veril…

七天学会C语言-第一天(C语言基本语句)

一、固定格式 这个是C程序的基本框架&#xff0c;需要记住&#xff01;&#xff01;&#xff01; #include<stdio.h>int main(){return 0; }二、printf 语句 简单输出一句C程序&#xff1a; #include<stdio.h> int main(){printf("大家好&#xff0c;&quo…

浅析Java责任链模式实现

一、概要 定义&#xff1a;责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 二、应用场景&#xff1a; 1.多条件流程判断&#xff1a;权限相关…