String AOP的使用

news2024/11/24 18:39:24

面向切面编程,面向特定方法编程,以方法为对象,在不修改原方法的基础上,对方法进行操作扩展等,底层是通过动态代理实现的

使用开发步骤:

1、创建一个类,加上@Aspect声明为一个AOP切面类,再加上@Component交给IOC容器来管理

2、定义方法

3、方法上加上通知类型注解,注解内使用切入点表达式,指定要被代理的方法路径以及返回值类型 ,重点掌握 @Around环绕通知

execution切入点表达式:
execution(访问修饰符? 返回值类型 包名.类名? .方法名(方法参数的类型) throws 异常?)

如:

@Around("execution(* com.cxl.service.*.*(..))")

带?表示可以省略的部分, *为通配符,单个独立的任意符号 ..为多个连续的任意符号,此处表示方法的形参类型和个数是任意的,也可以表示任意层级 根据业务需要可以使用&& || !来组合复杂的切入点表达式

@annotation切入点表达式: 用于 匹配标识有特定注解的方法
@annotation(注解全类名)
@Around("@annotation(com.itheima.anno.Log)") //匹配标识有Log注解的方法,com.itheima.anno.Log为注解的全类名


**连接点:JoinPoint**,可以被AOP控制的方法(暗含方法执行时的相关信息)
**通知:Advice**,指那些重复的逻辑,也就是共性功能(最终体现为一个方法,如下方统计方法的耗时的方法)
**切入点:PointCut**,匹配连接点的条件,通知仅会在切入点方法执行时被应用
**切面:Aspect**,描述通知与切入点的对应关系(通知+切入点)
**目标对象:Target**,通知所应用的对象

在这里插入图片描述
注意事项:

1、@Around环绕通知需要自己调用ProceedingJoinPoint.proceed()来让原始方法执行,其他通知不需要考虑目标方法执行

2、@Around环绕通知方法的返回值,必须指定Object,来接收原始方法的返回值

3、在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。
对于@Around通知,获取连接点信息只能使用ProceedingJoinPoint
对于其他四种通知,只能使用JoinPoint,它是ProceedingJoinPoint的父类型

具体代码示例如下:

@Slf4j
@Component
@Aspect
public class TimeAspect {
    @Around环绕通知,切入点表达式
    @Around("execution(* com.cxl.service.*.*(..))")
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();//调用原方法
        long end = System.currentTimeMillis();
        log.info(joinPoint.getSignature()+"方法执行耗时:{}毫秒",end-start);
        return result;
    }
    
    @After("execution(* com.cxl.service.DeptServiceImpl.*(..))")
	public void after(JoinPoint point){
		//1、获取目标对象的类名
		String className = point.getTarget().getClass().getName();
		//2、获取目标方法的方法名
		String methodName = point.getSignature().getName();
		//3、获取目标方法运行时传入的参数
		Object[] = point.getArgs();
		//4、放行 目标方法运行
		//5、获取目标方法运行的返回值
		Object result = point.proceed();
		log.info("after...");
	}
}

当切入点表达式都相同时,每个方法都写一遍太繁琐,可以使用
@PointCut注解
1、声明一个无意义方法,在此方法上加上
@PointCut注解,注解内填上重复的切入点表达式

2、其他需要使用该切入点表达式的方法在通知类型注解内填上该无意义方法的方法名()即可,其他切面类也可以用,与权限修饰符相对应,public,private

代码示例:

@Slf4j
@Component
@Aspect
public class TimeAspect {
    @Pointcut("execution(* com.cxl.service.DeptServiceImpl.*(..))")
    public void poinCut(){
        
    }
    @Around("poinCut()")
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        log.info(joinPoint.getSignature()+"方法执行耗时:{}毫秒",end-start);
        return result;
    }
    @AfterReturning("poinCut()")
    public void afterReturning(){
        log.info("afterReturning...");
    }
    @AfterThrowing("poinCut()")
    public void afterThrowing(){
        log.info("afterThrowing...");
    }
    @Before("poinCut()")
    public void before(){
        log.info("before...");
    }
    @After("poinCut()")
    public void after(){
        log.info("after...");
    }
}

通知执行顺序

当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行

执行顺序是按照切面类类名的字母排序来执行的

目标方法的通知方法:字母排名靠的先执行
目标方法的通知方法:字母排名靠的先执行


可以用 @Order注解加在切面类上来控制执行顺序

@Order(数字)

目标方法的通知方法:数字的先执行
目标方法的通知方法:数字的先执行

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

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

相关文章

2023 重新开始

感觉搞 IT 的日子最近都有点不太好过。 早上接到公司电话说今天是一个大日子。 为什么是大日子,相信所有人都是懂的。这次公司将会经历一次非常大的裁员,很不幸也在列表中。不过感觉这个好像也没有什么关系。 因为早就在意料之中的事情,经历…

c语言之结构体(初阶)

目录 1:结构体类型的声明 2:结构体初始化 3:结构体成员访问 4:结构体传参 1:结构体类型的声明 1:为啥要有结构体,因为当我们描述一个复杂对象的时候,可能平时我们的一个类型不能…

常见的五种排序

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C 🔥座右铭:“不要等到什么都没有了,才下…

批量提取某音视频文案(二)

牙叔教程 简单易懂 之前写过一篇 批量提取某音视频文案 , 在之前的教程中, 我用的是微软的语音转文字功能, 今天我们换个方法, 使用 逗哥配音 的 文案提取 功能 准备工作 下载视频和音频 我在github找到的是这个仓库 https://github.com/Johnserf-Seed/TikTokDownload 注意一…

VLANIF虚接口案例实践

1)拓扑 2)需求: -所有PC能够ping通自己的网关 -实现vlan间互通,实现所有的PC互通 3)配置步骤: 第一步:给pc配置IP地址 第二步:交换机创建vlan,做access和trunk -所有的交换机都配…

传统图形学对nerf的对比与应用落地

作者今年参加了China3DV的盛会,大会的发表、线下讨论、学者、工业界等等的交流着实对于Nerf有了更深的思考,以下是作者的抛砖引玉,如有不当之处敬请指出~ 传统图形学与nerf的简介: 传统图形学:显示表达几何表达方式&…

【CloudCompare教程】010:点云的裁剪功能(分段、裁剪、筛选)

本文讲解CloudCompare点云的裁剪功能(分段、裁剪、筛选)。 文章目录 一、点云的分段二、点云的裁剪三、点云的筛选一、点云的分段 加载案例点云数据,如下图所示: 选中图层点云,点击工具栏中的【分割】工具。 点击【激活线状选择】工具: 在需要裁剪的点云上绘制现状裁剪范…

使用免费的SSL证书将nginx配置的普通网站修改为HTTPS网站

一、需求说明 已经在Centos8系统中使用nginx搭建了网站;但是该网站没有实现HTTPS协议不安全;现需要将网站升级为HTTPS站点。 Linux环境对Nginx开源版源码下载、编译、安装、开机自启https://blog.csdn.net/xiaochenXIHUA/article/details/130265983?spm=1001.2014.3001.5501

chatgpt赋能python:Python交易接口简介

Python交易接口简介 Python作为一种高级编程语言,被广泛用于各种不同的领域,其中包括金融市场交易。Python交易接口提供了一种优雅而简单的方式,使得交易者能够方便地执行自己的交易策略。 什么是Python交易接口? Python交易接…

Effective第三版 中英 | 第2章 创建和销毁对象 | 考虑静态工厂方法而不是构造函数

文章目录 Effective第三版第2章 创建和销毁对象前言考虑静态工厂方法而不是构造函数 Effective第三版 第2章 创建和销毁对象 前言 大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 effective-java 书籍。同时也把自己…

基于SSM的人才招聘网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

模拟实现库函数:strcpy

目录 通过cplusplus网站了解函数功能: 断言assert的使用: 关于const: 本篇你最应该了解的内容: 通过cplusplus网站了解函数功能: 要模拟实现库函数,首先我们需要了解这个函数的参数,函数的…

主机加固介绍

最近公司做服务器安全,开始在市场了解产品,对这一块算是短暂的研究了一段时间,有一点心得给大家分享一下。 主机加固 最近主机加固的概念被炒得火热,主机加固的功能也正在被致力于服务器安全的相关人士所关注。 那么究竟什么是主…

【CVPR2022】CSWin Transformer详解

【CVPR2022】CSWin Transformer详解 0. 引言1. 网络结构2. 创新点2.1 Cross-Shaped Window Self-Attention2.2 Locally-Enhanced Positional Encoding(LePE) 3. 实验总结 0. 引言 Transformer设计中一个具有挑战性的问题是,全局自注意力的计算成本非常高&#xff0…

chatgpt赋能python:Python代码怎么敲:了解Python编程语言

Python代码怎么敲:了解Python编程语言 Python是一种高级编程语言,具有易读易用和高效性等优点。这使得Python成为了程序员的最佳选择,并成为了广泛应用于机器学习、Web开发、数据分析等领域。 Python代码敲法:小技巧 Python代码…

chatgpt赋能python:Python主要语句介绍

Python主要语句介绍 Python是一种广泛使用的高级编程语言,其语法简介、易于学习,并有丰富的库和工具支持。在Python中,主要的语句可以帮助开发人员快速编写代码,实现各种各样的任务。在本文中,我们将介绍Python中的主…

性能优化之高Log file sync等待实战案例分享

故障情况 AWR报告如下: 之后他们把大部分业务停掉后,Log file sync等待事件还是非常高。 通过对比昨天跟今天相同时间的AWR,在业务量小非常多的情况,等待时间还是高非常大。 诊断过程 log file sync等待事件首先判断当前系统IO…

“微商城”项目(1环境搭建)

开发工具分享: 百度网盘: 链接:https://pan.baidu.com/s/1lSsCjf-_zx1ymu6uZeG26Q?pwdhuan 提取码:huan 一、环境搭建说明 本项目服务端环境要求为 Windows Apache PHP MySQL。 下面介绍如何搭建环境,部署服…

CW32系列模数转换器(ADC)

模数转换器(ADC)的主要功能是将模拟量转换为数字量,方便MCU进行处理。下面以CW32L083为例介绍CW系列的模数转换器的特点和功能,并提供演示实例。 一、概述 CW32L083 内部集成一个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模…

位操作符的应用

目录 位操作符的概念: 一、&(按位与):两个整数的补码对应的二进制位有0则为0,两个同时为1才为1,得到的数仍为补码。 二、|(按位或):两个整数的补码对应的二进制位…