AOP面向切面编程

AOP简介

AOP(Aspect oriented Programming)面向切面编程,就是面向特定的方法编程,将方法比作一个一个的切面,可以向指定的方法执行前/后执行自己的逻辑。如统一获取方法的时间。

应用场景:
记录操作日志、权限控制、事务管理

优势:
代码无侵入(无需在原先的代码上修改)、减少重复代码、提高开发效率、维护方便

原理:

动态代理,运行时会注入一个动态代理对象(实现了注入的接口),动态代理对象会先后执行切片前的方法、调用方法、切片后的方法。
在动态代理时的userMapper:
在这里插入图片描述

核心概念

JoinPoint(连接点):能够被控制的方法,在spring中指方法的运行,含有方法执行时的相关信息。
Advice(通知):指重复、相同的功能,即共性功能。
PointCut(切入点):匹配连接的条件,实际被AOP控制的方法,通知只有在切入点方法执行时被应用。
Aspect(切面):描述通知和切入点的对应关系
target(目标对象):通知所应用的对象。

使用方式:
1.创建切面类 标记注解@Aspect @Component
2.创建切面方法参数为ProceedingJoinPoint(连接点),在方法上加入@Around注解表明该切面在哪个方法调用时执行。

切入点表达式:@Around("execution(* com.yi.springbootwebquickstart.controller.*.*(..))")  第一个*表示任意返回值,第二个*表示controller包下的任意类,第三个*表示类中的任意方法 根据自定义注解匹配:@Around(@annotation(com.yi.springbootwebquickstart.aop.mylog))
@Component
@Aspect
@Slf4j
public class TimeAspect {@Around("execution(* com.yi.springbootwebquickstart.controller.*.*(..))")public void recordTime(ProceedingJoinPoint joinPoint) throws Throwable {long begin = System.currentTimeMillis();Object result = joinPoint.proceed();long end = System.currentTimeMillis();log.info("{} cost time:"+(end-begin),joinPoint.getSignature());}
}

通知

1.通知类型

@Around 环绕通知,在目标方法执行前后执行
@Before 前置通知,在目标方法执行前执行
@After 后置通知,在目标方法执行后执行,有异常也会执行
@AfterReturning 返回后通知,在目标方法返回后执行,有异常不会执行
@AfterThrowing 异常后通知,在目标方法发生异常后执行


@Component
@Aspect
@Slf4j
public class TimeAspect {//定义一个方法,将相同的切入点表达式抽出出来@Pointcut("execution(* com.yi.springbootwebquickstart.controller.*.*(..))") public void pt(){}@Around("pt()")public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {long begin = System.currentTimeMillis();Object result = joinPoint.proceed();long end = System.currentTimeMillis();log.info("{} cost time:"+(end-begin),joinPoint.getSignature());return result;}@Before("pt()")public void before(){System.out.println("before");}@After("pt()")public void after(){System.out.println("after");}@AfterReturning("pt()")public void afterReturning(){System.out.println("afterReturning");}@AfterThrowing("pt()")public void afterThrowing(){System.out.println("afterThrowing");}
}
2.通知顺序

默认是按照类名以环绕顺序来执行,字母越靠前:通知前方法越先执行,通知后方法越后执行。
在这里插入图片描述
可以加入在类名上加入@Order(int) 来控制执行顺序,数字越小通知前方法越先执行,通知后方法越后执行。

连接点:可以被AOP控制的方法

在Spring中特指方法的运行,可以通过连接点获取方法执行时的相关信息,如类名、方法名、方法参数等。
@Around通知只能用ProceedingJoinPoint,其他通知只能用JointPoint

log.info("目标方法的类名:{}",joinPoint.getTarget().getClass().getName());
log.info("目标方法签名:{}",joinPoint.getSignature());
log.info("目标方法方法名:{}",joinPoint.getSignature().getName());
log.info("运行参数:{}",joinPoint.getArgs());

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

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

相关文章

Node.js初体验

Node.js简介 node.js的运行环境 1.V8引擎对js代码进行解析与执行 2.内置API:fs、path、http...等,提供了一些能力,能够使得js调用这些API去做一些后端的事情 流程:我们在node.js的运行环境中编写待执行的JavaScript代码&#…

部署k8s dashboard(这里使用Kubepi)

9. 部署k8s dashboard(这里使用Kubepi) Kubepi是一个简单高效的k8s集群图形化管理工具,方便日常管理K8S集群,高效快速的查询日志定位问题的工具 部署KubePI(随便在哪个节点部署,我这里在主节点部署&#…

黑马JVM总结(三十)

(1)类加载-连接-解析 new对象,会触发对象的解析和初始化 通过类加载器加载类C,这里只会进行类C的加载并不会导致类C的解析以及初始化,这样加载类C的时候类D也不会解析跟初始化 通过jps找到进程id: 打开…

Kafka SASL认证授权(四)认证源码解析

Kafka SASL认证授权(四)认证源码解析。 官网地址:https://kafka.apache.org/ 一、认证流程 在了解kafka网络模型的基础上,了解它的认证流程: ApiVersionsRequest->SaslHandshakeRequest->a series of SASL client and server tokens corresponding to the mechani…

IDEA的使用(二)快捷键 (IntelliJ IDEA 2022.1.3版本)

1. IDEA中的常用快捷键 1.1 通用型快捷键 1.2 提高编写速度 ctrl shift ↑或↓ 只能在方法里面移动代码。 alt shift ↑或↓ 可以向方法外移动代码。 设置过自动导包,所以不用批量导包啦。 1.3 类结构、查找和查看源码 1.4 查找、替换和关闭 1.5 调整格式 1.6 De…

Elasticsearch 分片内部原理—使文本可被搜索、动态更新索引

目录 一、使文本可被搜索 不变性 二、动态更新索引 删除和更新 一、使文本可被搜索 必须解决的第一个挑战是如何使文本可被搜索。 传统的数据库每个字段存储单个值,但这对全文检索并不够。文本字段中的每个单词需要被搜索,对数据库意味着需要单个字…

【CNN-GRU预测】基于卷积神经网络-门控循环单元的单维时间序列预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

__main__文件学习测试如下

参考博客 https://www.jb51.net/article/251567.htm test01.py # https://www.jb51.net/article/251567.htmdef step():print(__name__)print("step1 买菜""step2 洗菜""step3 切菜""step4 炒菜")if __name__ __main__:print(准备制…

【Android知识笔记】图片专题(BitmapDrawable)

如何计算一张图片的占用内存大小? 注意是占用内存,不是文件大小可以运行时获取重要的是能直接掌握计算方法基础知识 Android 屏幕像素密度分类: (其实还有一种 ldpi = 120,不过这个已经绝种了,所以最低的只需关心mdpi即可) 上表中的比例为:m : h : xh : xxh: xxxh = …

机器学习-无监督算法之降维

降维:将训练数据中的样本从高维空间转换到低维空间,降维是对原始数据线性变换实现的。为什么要降维?高维计算难,泛化能力差,防止维数灾难优点:减少冗余特征,方便数据可视化,减少内存…

使用VirtualBox安装Ubuntu系统【保姆级】

本文详细介绍使用VirtualBox安装Ubuntu系统,并实现虚拟机Ubuntu和Windows系统之间共享粘贴板和共享文件夹,主要包含如下5部分内容: 下载VirtualBox软件安装包下载Ubuntu系统镜像安装VirtualBoxVirtualBox新建Ubuntu虚拟机并安装Ubuntu系统Vi…

巴以冲突中暴露的摄像头正对安全构成威胁

巴以冲突爆发后,许多配置不当的安全摄像头正暴露给黑客活动分子,使其周遭人员面临巨大安全风险。 Cyber​​news 研究人员发现,在以色列至少有165 个暴露的联网 RTSP 摄像头,在巴勒斯坦有 29 个暴露的 RTSP 摄像头。在巴勒斯坦&am…

Python 机器学习入门之逻辑回归

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 第一章 Python 机器学习入门之牛顿法 第二章 Python 机器学习入门之逻辑回归 逻辑回归 系列文章目录前言一、逻辑回归简介二、逻辑回归推导1、问题2、Sigmoid函数3、目标函数3.1 让…

Prometheus:优秀和强大的监控报警工具

文章目录 概述Prometheus的底层技术和原理数据模型数据采集数据存储查询语言数据可视化 Prometheus的部署Prometheus的使用配置数据采集目标查询监控数据设置警报规则 查看数据可视化总结 概述 Prometheus是一款开源的监控和警报工具,用于收集和存储系统和应用程序…

mysql主从工作原理、搭建

目录 一、mysql为什么要用主从架构? 二、mysql数据库主从复制原理是什么? 详细的主从复制过程如下图: 主从复制过程概述: 三、mysql主从如何搭建? 本次安装的数据库版本为mysql5.7 1、准备两台服务器&#xff08…

tomcat多实例部署jenkins

tomcat多实例部署jenkins 文章目录 tomcat多实例部署jenkins1.简介:2.优缺点:3.工作原理:4.工作流程:5.tomcat多实例部署jenkins流程5.1.环境说明5.2.部署前准备工作5.3.多实例部署tomcat5.4.部署jenkins5.5.创建一个jenkins项目5…

Three.js如何计算3DObject的2D包围框?

推荐:用 NSDT编辑器 快速搭建可编程3D场景 在Three.js应用开发中,有时你可能需要为3D场景中的网格绘制2D的包围框,应该怎么做? 朴素的想法是把网格的3D包围框投影到屏幕空间,例如,下图中的绿色框 3D包围框…

npm install报--4048错误和ERR_SOCKET_TIMEOUT问题解决方法之一

一、问题描述 学习vue数字大屏加载动漫效果时,在项目终端页面输入全局下载指令 npm install -g json-server 问题1、报--4048错误 会报如下错误 operation not permitted......errno: -4048code:EPERMsyscall: mkdir......The operation was reiected by your op…

【分布式计算】九、容错性 Fault Tolerance

分布式系统应当有一定的容错性,发生故障时仍能运行 一些概念: 可用性Availability:系统是否准备好立即使用 可靠性Reliability:系统连续运行不发生故障 安全性:衡量安全故障的指标,没有严重事件发生 可维护…

RBF神经网络案例——客户流失率预测

目录 背景介绍 1、径向基神经网络结构 2、符号说明 3、计算网络输出 4、计算能量函数 网络学习步骤 步骤1、先将能量函数E写成各参数的复合函数结构 步骤2、求E关于各参数的偏导 步骤3、求各参数的调整量 步骤4、计算各参数的调整量 5、按照步骤1-步骤4编写RBF神经网络…