认识 spring AOP (面向切面编程) - springboot


前言

本篇介绍什么是spring AOP, AOP的优点,使用场景,spring AOP的组成,简单实现AOP 并 了解它的通知;如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
  • 1. 什么是spring AOP?
    • AOP优点:
    • spring AOP 使用场景
    • 认识AOP的组成
  • 2. 实现spring AOP - 认识各种通知
  • 总结

本文开始

1. 什么是spring AOP?

AOP: 面向切面编程,也就是面向某一类编程,对某一类事情进行统一处理;

spring AOP: 是实现了AOP这种思想的一个框架;

AOP优点:

  • 减少重复代码:对一类同样的工作统一处理;
  • 提高开发效率:同上;

spring AOP 使用场景

使用:统一用户登录判断; 统一异常处理; 统一日志等等;

认识AOP的组成

  • 切面- Aspect:AOP定义的是一个事件;例如:登录操作的整个过程;- 某个具体功能实现的过程 - 一共类;
  • 切点 - Pointcut:AOP定义的具体规则;例如:验证登录的 方法;- 实现功能的方法 - 类中的方法定义;
  • 连接点 - Join Point:可能触发切点的所有点;- 可能调用功能的某个方法的点;
  • 通知 - Advice:AOP具体执行的方法;例如:方法的具体实现;- 代码具体实现 - 类中方法的具体实现;
    ① 前置通知 @Before
    ② 后置通知 @After
    ③ 环绕通知 @Around
    ④ 异常通知 @AfterThrowing
    ⑤ 返回通知 @AfterReturning

通知执行的顺序:环绕通知之前 > 前置通知 > 方法 > 方法返回后通知 > 后置通知 > 环绕通知之后

在这里插入图片描述

2. 实现spring AOP - 认识各种通知

2.1 在springboot项目中,原有依赖 + 添加spring AOP 依赖

2.2 实现过程 定义切面 + 定义切点 + 定义通知

  • 定义切面 -> 定义类
@Aspect // 定义切面
@Component //随框架启动,注入到容器中
public class UserAspect {
	//定义切点 + 通知...
}
  • 定义切点 -> 定义方法
//定义切点, 对UserController进行拦截
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {
    }//空方法:方法名用于标识

切点表达式:识别该包下类下的任意方法,参数不限;

在这里插入图片描述

  • 定义通知:切点的方法名,写在通知参数中,用于识别是哪个切点的通知;(想了解具体的 百度 - AspectJ 语法)
 //前置通知
    @Before("pointcut()")
    public void doBefore() {
        System.out.println("执行前置通知!");
    }
//后置通知
    @After("pointcut()")
    public void doAfter() {
        System.out.println("执行后置通知!");
    }
//后置返回后的通知
    @AfterReturning("pointcut()")
    public void doAfterReturn() {
        System.out.println("执行返回后通知!");
    }//抛出异常后通知
    @AfterThrowing("pointcut()")
    public void doAfterThrow() {
        System.out.println("执行抛异常后的通知!");
    }
//环绕通知
    //使用环绕通知:例如:统计时间,就可以使用环绕通知,将通知前 与 通知后 放在一起
    @Around("pointcut()") //ProceedingJoinPoint:获取连接点;执行 =》返回框架,执行
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("执行环绕通知之前!");
        Object result = joinPoint.proceed();
        System.out.println("执行环绕通知之后");
        return result;
    }

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js-6:typeof和instanceof的区别

1、typeof typeof操作符返回一个字符串,表示未经计算的操作数的类型。 operand表示对象或原始值的表达式,其类型将被返回。 从上面的例子可以看出,前6个都是基础数据类型,虽然typeof null为object,但这只是javascrip…

Qt扫盲-Model/View入门

Model/View 编程入门 一、概述二、介绍1. 标准部件2. Model/View 控件3. Model/View控件概述4. 在表格单和 model 之间使用适配器 Adapters 三、 简单的 model / view 应用程序示例1. 一个只读表2. 使用role扩展只读示例3. 表格单元中的时钟4. 为列和行设置标题5. 最小编辑示例…

20天学会rust(二)rust的基础语法篇

在第一节(20天学rust(一)和rust say hi)我们配置好了rust的环境,并且运行了一个简单的demo——practice-01,接下来我们将从示例入手,学习rust的基础语法。 首先来看下项目结构: 项目…

OpenUSD联盟:塑造元宇宙的3D未来

一、引言 近日,美国3D内容行业的五家主要公司苹果、英伟达、皮克斯、Adobe和Autodesk联合成立了OpenUSD联盟(AOUSD)。这一联盟的成立标志着元宇宙领域的一次重要合作,旨在制定元宇宙的3D图形标准。本文将深入探讨OpenUSD联盟的目…

MySQL 在CentOS下安装

yum安装 1、yum源安装 yum install mariadb-server2、启动MySQL服务 systemctl start mariadb3、查看运行状态 systemctl status mariadb4、设置初始密码 mysql -u rootuse mysql;update user set passwordpassword("root")where userroot;flush privileges;e…

车载软件架构 —— 闲聊几句AUTOSAR OS(十)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

嵌入式开发学习(STC51-16-ADC模数转换)

内容 通过ADC转换电路采集电位器AD值,将采集的AD值转换成电压值,通过数码管显示出来; 采集光敏电阻的AD值; 采集热敏电阻的AD值; 采集外部通道AIN3的电压值; 为了方便显示,我们可以通过独立…

C高级 作业 day3 8/4

1.整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 1 #!/bin/bash2 arr(ls -l ~ | cut -d r -f 1 | grep -w d )3 arr1(ls -l ~ | cut -d r -f 1 | grep -w -)4 echo "目录文件个数为 ${#arr[*]}"5 echo "普通文件个数为 ${#arr1[*]}&q…

小程序开发趋势:探索人工智能在小程序中的应用

第一章:引言 小程序开发近年来取得了快速的发展,成为了移动应用开发的重要一环。随着人工智能技术的飞速发展,越来越多的企业开始探索如何将人工智能应用于小程序开发中,为用户提供更智能、便捷的服务。本文将带您一起探索人工智能…

40.利用欧拉法求解微分方程组(matlab程序)

1.简述 求解微分方程的时候,如果不能将求出结果的表达式,则可以对利用数值积分对微分方程求解,获取数值解。欧拉方法是最简单的一种数值解法。前面介绍过MATLAB实例讲解欧拉法求解微分方程,今天实例讲解欧拉法求解一阶微分方程组。…

js-7:javascript原型、原型链及其特点

1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字…

vs导出和导入动态库和静态库

1. 动态库和导出和导入 1.1 动态库的导出 1. 创建新项目 新建新项目,选择动态链接库(DLL)。 填写项目名称,并选择项目保存的路径,然后点击创建。 创建完成后,会自动生成如下所示文件,可以根据…

LabVIEW使用DSA技术从X射线图像测量肺气容量

LabVIEW使用DSA技术从X射线图像测量肺气容量 相衬X射线(PCX)成像技术利用相邻介质之间折射率的微小差异来增强传统X射线成像通常不可见的物体的边界。事实证明,这一进展在一系列生物医学和材料科学中非常有益于材料表征、疾病检测以及解剖形…

C语言 — 动态内存管理(动态内存函数)

前言 本期分为三篇介绍动态内存管理相关内容,关注博主了解更多 博主博客链接:https://blog.csdn.net/m0_74014525 本期介绍动态内存函数,函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇&#xff…

RGB_LCD简介

文章目录 前言一、LCD原理1、构造2、分辨率3、像素格式4、LCD接口5、ATK-7016 的屏幕接口原理图 二、LCD时序1、时间参数2、行场时序1、行显示时序:2、场显示时序:3、数据同步模式4、像素时钟 三、总结四、参考资料 前言 LCD (Liquid Crystal Display)是…

数据结构——双链表

我宁愿靠自己的力量,打开我的前途,而不愿求有力者垂青 文章目录 双线向链表各接口函数名或变量名 双向链表接口实现源码 快速索引【头文件及函数声明】 双向链表接口实现 双向链表的构造分析 双向链表的定义及初始化 双向链表的插入和删除 往期…

音频客观感知MOS对比,对ViSQOL、PESQ、MosNet(神经网络MOS分)和polqa一致性对比和可信度验证

原创:转载需附链接: https://blog.csdn.net/qq_37100442/article/details/132057139?spm1001.2014.3001.5502 一、背景 Mos分评价音质重要指标,最近也有很多机构和公司在研究适合自己的评价体系。目前Mos分主要分为主观评测和客观感知评价。…

智能仪表板DevExpress Dashboard v23.1亮点 - 增强对自定义导出的支持

DevExpress Dashboard v23.1版本增强了自定义导出到Excel的功能等,欢迎下载最新版本体验! DevExpress Dashboard v23.1正式版下载(Q技术交流:523159565) 所有平台 导出自定义仪表板项目到Excel 用户现在可以在WinForms和Web应…

危大工程智慧工地源码,微服务+Java+Spring Cloud +UniApp +MySql 物联网、人工智能、视频AI分析

一套智慧工地管理平台源码,PC端移动APP端可视货数据管理端源码 智慧工地可视化系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术,通过工地中台、三维建模服务、视频AI分析服务等技术支撑,实现智慧工地高精度动态仿真&a…

C++ 多线程:std::future

std::future std::future 简介示例1博客引用来源 std::future 简介 我们前面介绍的std::thread 是C11中提供异步创建多线程的工具,只能是异步运行任务,却无法获取任务执行的结果,一般都是依靠全局对象,全局对象在多线程下是及其不…
最新文章