java Web-Spring AOP

AOP的概念

AOP:面向切面编程,面向方法编程。简单理解就是对特定方法的扩充的思想

例如我们要在特定方法进行方法的执行时间判断,我们假如去使用在每个方法去进行业务逻辑扩充,这样就太繁琐了,而使用AOP就可以简化操作。Spring AOP 底层是通过动态代理技术实现的,要想查看动态代理可以查看我之前的文章 动态代理技术。

AOP 的组成

切面

AOP 是面向 切面编程,所以这是 AOP 最重要的功能。定义 AOP 是针对哪个统一的功能,这个功能就叫做一个切面。比如用户登录功能或方法的统计日志,他们就各自是一个切面。切面是由 切点 和 通知组成的。

连接点
就是所有可能触发 AOP(拦截方法的点),就称为连接点。

切点
切点会提供一个规则,用来匹配连接点,并且来实现通知。也就是在何处执行通知。

通知
重复的共性功能就是通知。就是规定 AOP 执行的时机和执行的方法,就是切点处的执行动作通知注解如下:

前置通知: 使用 @Before,通知方法会在目标方法调用之前执行。
后置通知: 使用 @After,通知方法会在目标方法返回或者抛出异常后调用。
返回之后通知: 使用 @AfterReturning,通知方法会在目标方法返回后调用。有异常不调用
抛异常后通知: 使用 @AfterThrowing,通知方法会在目标方法抛出异常后调用。
环绕通知: 使用 @Around通知包裹了被通知的方法,在被通知的方法通知之前和调用之后,执行自定义的行为。注意:1.AOP方法内需要调用procedingJoinPoint.proceed();方法来执行原始方法。2.Around环绕通知的返回值必须指定为Object来接收原始方法返回值

使用步骤

1.导入AOP依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.编写AOP程序 

1.定义模板方法类,加上注解@Component交给IOC容器管理,还要加上@Aspect注解声明这是一个AOP类。

2.声明切点并定义通知:使用@PointCut注解注解一个方法来声明切点,也可以直接把表达式放入通知注解的参数中接收来声明切点

//方式一
@pointcut("切入点表达式)")
private void pt(){}//声明切点@Before("pt()")
public void beforeTest(){
loog.info("beforeTest");
}
//方式二@Before("切入点表达式")
public void beforeTest(){
loog.info("beforeTest");
}

 通知的执行顺序

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

默认情况下顺序和切面类的类名大小有关,before通知类名靠前的 先执行,after通知类名靠前的 后执行。

我们可以通过@Order(数字)注解加在AOP类上来指定切面类控制顺序,before通知类数字小的 先执行,after通知数字小的 后执行。

切入点表达式

1.execution(...)

根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配

语法:

execution([访问修饰符] 返回值 [包名.(类名./接口名.)]方法名(方法参数,要填全类名) [throws 异常])

可以使用通配符描述切入点:

*: 单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分

案例:

execution(* com .*. service .*. update*(*))

.. : 多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数

案例:

execution(* com.test .. DeptService .* ( .. ))

想要同时匹配多个连接点,可以使用||来连接

execution(* com.test.service. DeptService.list ()) || execution(* com.test.service. DeptService.delete (java. lang. Integer) ) 

2.@annotation(...)

根据标识注解进行匹配

语法:

@annotation(注解的全类名)

1.首先自定义一个注解用来标记匹配方法

@Retention(RetentionPolicy.RUNTIME)//元注解,运行时有效
@Target(ElementType.METHOD)//元注解,注解属性为方法上
public @intetface Mytest{}

2.在要切入的方法上加上注解

@MyTest
@Override
public List<dept> list{
List<dept> deptList =deptMapper.list();
return deptList;
}@MyTest
@Override
public List<dept> delete{
deptMapper.delete(id);
}

3.使用切入点表达式

连接点

在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。我们可以在形参中声明参数来获取到他的对象。

  • 对于@Around 通知,获取连接点信息只能使用 ProceedingJoinPoint
  • 对于其他四种通知,获取连接点信息只能使用JoinPoint,它是 ProceedingJoinPoint 的父类型
@Around("execution(...)")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {String className= joinPoint.getTarget().getClass().getName();//获取目标类名Signature signature = joinPoint.getSignature();//获取目标方法签名String methodName= joinPoint.getSignature().getName();//获取目标方法名Object[] args= joinPoint.getArgs();//获取目标方法运行参数Object res =joinPoint.proceed();//执行原始方法,获取返回值(环绕通知)return res;}
@Before("execution(...)")public void before(JoinPoint joinPoint) {String className = joinPoint.getTarget().getClass().getName();//获取目标类名Signature signature= joinPoint.getSignature();//获取目标方法签名String methodName=joinPoint.getSignature().getName();//获取目标方法名Object[] args=joinPoint.getArgs();//获取目标方法运行参数}

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

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

相关文章

Pytorch 学习路程 - 1:入门

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…

Python网络爬虫项目开发实战:怎么处理下载缓存

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python网络爬虫项目开发实战_下载缓存_编程案例解析实例详解课程教程.pdf 一、下载缓存的简介 在网络爬虫项目开发中,下载缓存是一个重要的优化手段,…

.net6项目模板搭建教程

1.集成log4net 安装如下扩展依赖即可&#xff0c;已经包含了log4net依赖&#xff1a; Microsoft.Extensions.Logging.Log4Net.AspNetCore 添加日志配置文件&#xff1a; 日志配置文件属性设置为始终复制&#xff1a; 注入服务&#xff1a; #region 注入log4net日志服务build…

2024年高校辅导员考试题库及答案

一、选择题 4.根据宪法和法律&#xff0c;可以制定行政法规的是&#xff1a;&#xff08;&#xff09; A.全国人民代表大会&#xff1b; B.全国人民代表大会常务委员会&#xff1b; C.国务院&#xff1b; D.国家教育部 答案&#xff1a;C …

一年期免费SSL证书正在消失?这里还有

在数字化时代&#xff0c;数据安全与隐私保护的重要性不言而喻。SSL&#xff08;Secure Sockets Layer&#xff09;证书作为保障互联网通信安全的关键工具&#xff0c;其有效期一直是业界关注的焦点。近年来&#xff0c;我们见证了免费一年期SSL证书向三个月有效期的转变&#…

程序员高效创新,健康有道:缓解工作压力的经验分享

对于这个话题&#xff0c;我想分享一下我个人的一些经验&#xff0c;如果大家有兴趣的&#xff0c;欢迎大家一起分享。 定期休息和放松&#xff1a; 设置定时器&#xff0c;每隔一段时间就进行短暂的休息&#xff0c;放松眼睛和身体。例如&#xff0c;每小时休息5-10分钟。使用…

win11右键默认显示更多选项

目录 方法一&#xff1a;使用 Shift 键加右键单击方法二&#xff1a;修改注册表方法三&#xff1a;运行命令重启打开命令行恢复win10右键恢复win11右键 在 Windows 11 中&#xff0c;右键单击某个文件或文件夹时&#xff0c;默认情况下可能会显示较少的选项。如果您希望在右键菜…

Oracle EBS Interface/API(54)- GL日记账审批

背景: 客户化创建薪酬凭证或者银企付款入账日记账以后,用户希望自动提交审批流程,无需到系统标准功能点击审批,减少用户操作。 快速参考 参考点内容功能导航N: GL->日记账->输入并发请求None基表GL.GL_JE_BATCHESAPI参考下面介绍错误信息表None接口FormNone接口Reque…

甲方IT日益壮大,企业服务软件行业面临的困境与出路

随着信息技术的飞速发展&#xff0c;甲方企业的IT能力日益壮大&#xff0c;对软件服务的需求也呈现出多样化、复杂化的趋势。然而&#xff0c;在这种看似繁荣的背后&#xff0c;企业服务软件行业却面临着前所未有的困境与挑战。本文旨在探讨当前企业服务软件行业所面临的困境&a…

相机标定的原理

1.相机标定资料 这个视频是建议有一定基础的去看&#xff0c;详细介绍了整个标定的过程。 https://www.bilibili.com/video/BV1R7411m7ZQ/?spm_id_from333.337.search-card.all.click&vd_sourcec205d4d10f730a57820343328741984a 这个文章基础一点&#xff0c;可以先看 h…

day24 java IO流 对象流 序列化与反序列化

对象流&#xff1a;ObjectInputStream 和 ObjectOutputStream 可以把内存中的数据&#xff08;基本数据类型数据&#xff0c;对象的处理流&#xff09;持久化起来。需要的时候可以还原成内存层面的数据。序列化&#xff1a;用ObjectOutputStream类保存基本类型数据或对象的机制…

【YOLOv8改进[注意力]】YOLOv8添加DAT(Vision Transformer with Deformable Attention)助力涨点

目录 一 DAT 二 YOLOv8添加DAT助力涨点 1 总体修改 2 配置文件 3 训练 其他 一 DAT 官方论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Xia_Vision_Transformer_With_Deformable_Attention_CVPR_2022_paper.pdf Transformers最近在各种视…

python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

轻松搭建llama3Web 交互界面 - Ollama + Open WebUI

Ubuntu下安装&#xff1a;&#xff08;官网&#xff1a;Download Ollama on Linux&#xff09; curl -fsSL https://ollama.com/install.sh | sh 就运行起来ollama了&#xff0c;不放心可以用ollama serve查看一下 ollama run llama3 就可以跑起来了&#xff0c; 那么我们肯…

信息物理系统技术概述_1.概念和实现

1.信息物理系统的概念 1.1信息物理系统的来源 信息物理系统&#xff08;Cyber-Physical Systems&#xff0c;CPS&#xff09;这一术语&#xff0c;最早由美国国家航天局于1992年提出&#xff0c;到2006年&#xff0c;美国国家科学基金会科学家海伦 •吉尔在国际上第一个关于信…

端口转发与端口映射区别

端口映射和端口转发是两种不同的网络技术&#xff0c;用于实现服务器或设备之间的通信。 端口映射是将一台设备&#xff08;通常是路由器或防火墙&#xff09;的公共IP地址和端口映射到内部网络中的另一台设备的特定IP地址和端口上。当外部网络上的请求到达公共IP地址和端口时…

【SAP ME 12】SAP NWDS(eclipse)下载、安装,配置

1、下载 1.1、描述 1.2、下载 2、安装 3、配置 3.1、域名映射

windows10环境下conda迁移到linux环境

网上给出的方案错误百出&#xff0c;记录一下正确方案。 1 创建yaml文件 创建到终端所在路径下 conda activate 环境名 conda env export --no-build >环境名.yaml2 新操作系统中创建新的conda环境 conda env create -f 环境名.yaml3 删除不兼容的包 终端报错 Could n…

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

我的一些 35+ 前同事的现状

大家好&#xff0c;我是坤哥&#xff0c;好久不见&#xff0c;今天简单和大家聊一下我目前观察到的前同事的现状 今年和一些前同事简单聊过&#xff0c;他们的现状如下&#xff1a; A: 去新西兰做 iOS 开发快 10 年了&#xff0c;马上就要拿到永久居留证了&#xff0c;他说在新…