AOP切面执行顺序

article/2025/9/21 14:11:56

文章目录

    • 一. 概述
    • 二. 讲述
      • 1. 单切面中各通知方法的执行顺序
      • 2. 多切面中各通知方法的执行顺序
      • 3. 多切面的通知方法中抛出异常
    • 参考资料


一. 概述

  • 本文主要讲述以下几点
    1. 单AOP切面时,各通知方法的执行顺序。
    2. 多AOP切面时,多切面的执行顺序和各通知方法的执行顺序。

二. 讲述

1. 单切面中各通知方法的执行顺序

单切面中各通知方法执行顺序·总结

  • spring aop就是一个同心圆,以要执行的方法为圆心。从最外层按照依次执行切面的@Around方法,@Before方法。然后执行method方法,最后再依次执行@After、@AfterReturning方法。
  • 图示
  • 代码示例
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Aop1 {
}@Component
@Aspect
@Slf4j
@Order(1)
public class Aop1Aspect {@Pointcut("@annotation(com.zijikanwa.ssmspringboottest.manager.aop.Aop1)")private void pointCutMethod() {}//声明前置通知@Before("pointCutMethod()")public void doBefore(JoinPoint point) {System.out.println("Aop1Aspect:doBefore");return;}//声明后置通知@AfterReturning(pointcut = "pointCutMethod()", returning = "returnValue")public void doAfterReturning(JoinPoint point, Object returnValue) {System.out.println("Aop1Aspect:doAfterReturning");}//声明例外通知@AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")public void doAfterThrowing(Exception e) {System.out.println("Aop1Aspect:doAfterThrowing");}//声明最终通知@After("pointCutMethod()")public void doAfter() {System.out.println("Aop1Aspect:doAfter");}//声明环绕通知@Around("pointCutMethod()")public Object doAround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("Aop1Aspect:doAround1");Object obj = pjp.proceed();System.out.println("Aop1Aspect:doAround2");return obj;}
}@Component
public class TEst {@Aop1public void testAop(){System.out.println("testAop");}
}@RunWith(SpringRunner.class)
@SpringBootTest(classes = { TestApplication.class })
@EnableAutoConfiguration
class SsmspringboottestApplicationTests {@Testpublic void test(){tEst.testAop();}
}
  • 执行结果
Aop1Aspect:doAround1
Aop1Aspect:doBefore
testAop
Aop1Aspect:doAround2
Aop1Aspect:doAfter
Aop1Aspect:doAfterReturning

2. 多切面中各通知方法的执行顺序

多切面各通知方法的执行顺序·总结

  1. 多切面的执行顺序:按照切面给定的order执行,order越小越先执行,但最先执行的最后结束。
  2. 多切面中各通知方法的执行顺序:与单切面类似。spring aop就是一个同心圆,以要执行的方法为圆心,最外层的order最小。从最外层按照AOP1、AOP2的顺序依次执行@Around方法,@Before方法。然后执行method方法,最后按照AOP2、AOP1的顺序依次执行@After、@AfterReturning方法。
  • 图示
  • 代码示例:在AOP1的基础上增加AOP2
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Aop2 {
}@Component
@Aspect
@Slf4j
@Order(2)
public class Aop2Aspect {@Pointcut("@annotation(com.zijikanwa.ssmspringboottest.manager.aop.Aop2)")private void pointCutMethod() {}//声明前置通知@Before("pointCutMethod()")public void doBefore(JoinPoint point) {System.out.println("Aop2Aspect:doBefore");return;}//声明后置通知@AfterReturning(pointcut = "pointCutMethod()", returning = "returnValue")public void doAfterReturning(JoinPoint point, Object returnValue) {System.out.println("Aop2Aspect:doAfterReturning");}//声明例外通知@AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")public void doAfterThrowing(Exception e) {System.out.println("Aop2Aspect:doAfterThrowing");}//声明最终通知@After("pointCutMethod()")public void doAfter() {System.out.println("Aop2Aspect:doAfter");}//声明环绕通知@Around("pointCutMethod()")public Object doAround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("Aop2Aspect:doAround1");Object obj = pjp.proceed();System.out.println("Aop2Aspect:doAround2");return obj;}
}@Component
public class TEst {@Aop1@Aop2public void testAop(){System.out.println("testAop");}
}@RunWith(SpringRunner.class)
@SpringBootTest(classes = { TestApplication.class })
@EnableAutoConfiguration
class SsmspringboottestApplicationTests {@Testpublic void test(){tEst.testAop();}
}
  • 执行结果
Aop1Aspect:doAround1
Aop1Aspect:doBefore
Aop2Aspect:doAround1
Aop2Aspect:doBefore
testAop
Aop2Aspect:doAround2
Aop2Aspect:doAfter
Aop2Aspect:doAfterReturning
Aop1Aspect:doAround2
Aop1Aspect:doAfter
Aop1Aspect:doAfterReturning

3. 多切面的通知方法中抛出异常

  1. AOP1中@Around注解的方法抛出异常:执行@After和@AfterThrowing,然后抛出异常。
@Component
@Aspect
@Slf4j
@Order(1)
public class Aop1Aspect {@Around("pointCutMethod()")public Object doAround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("Aop1Aspect:doAround1");int i = 1 / 0; // java.lang.ArithmeticException: / by zeroObject obj = pjp.proceed();System.out.println("Aop1Aspect:doAround2");return obj;}
}
  • 运行结果
Aop1Aspect:doAround1
Aop1Aspect:doAfter
Aop1Aspect:doAfterThrowingjava.lang.ArithmeticException: / by zero
  1. Method方法抛出异常:依次执行多个切面的@After和@AfterThrowing
@Component
public class TEst {@Aop1@Aop2public void testAop(){System.out.println("testAop"); // 可以执行到int i = 1 / 0; System.out.println("testAop---"); //执行不到}
}
  • 执行结果
Aop1Aspect:doAround1
Aop1Aspect:doBefore
Aop2Aspect:doAround1
Aop2Aspect:doBefore
testAop
Aop2Aspect:doAfter
Aop2Aspect:doAfterThrowing
Aop1Aspect:doAfter
Aop1Aspect:doAfterThrowingjava.lang.ArithmeticException: / by zero
  1. AOP1中@After注解的方法抛出异常:执行@After抛出异常前的部分和@AfterThrowing,然后抛出异常。
@Component
@Aspect
@Slf4j
@Order(1)
public class Aop1Aspect {@After("pointCutMethod()")public void doAfter() {System.out.println("Aop1Aspect:doAfter"); // 可以执行到int i = 1 / 0; System.out.println("Aop1Aspect:doAfter----");  //执行不到}
}
  • 执行结果
Aop1Aspect:doAround1
Aop1Aspect:doBefore
Aop2Aspect:doAround1
Aop2Aspect:doBefore
testAop
Aop2Aspect:doAround2
Aop2Aspect:doAfter
Aop2Aspect:doAfterReturning
Aop1Aspect:doAround2
Aop1Aspect:doAfter
Aop1Aspect:doAfterThrowingjava.lang.ArithmeticException: / by zero

参考资料

  • spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序)
  • SpringAOP多切面的执行顺序
  • spring多个AOP执行先后顺序

http://chatgpt.dhexx.cn/article/CmiTiUrX.shtml

相关文章

spring aop切面执行顺序

spring aop切面执行顺序 切面执行顺序 现有切面1、切面2对同一个切点按先后顺序执行(切面1先于切面2执行) 切面1:Before、After、AfterReturnning、AfterThrowing、Around 执行前、Around 正常执行、Around 异常执行、Around 执行后切面2&am…

一文带你搞定AOP切面

摘要:AOP在spring中又叫“面向切面编程”,是对传统我们面向对象编程的一个补充,主要操作对象就是“ 切面”, 可以简单的理解它是贯穿于方法之中,在方法执行前、执行时、执行后、返回值后、异常后要执行的操作。 本文分…

SpringBoot AOP切面实现

文章目录 一、AOP简介二、AOP体系与概念三、AOP实例1、创建SpringBoot工程2、添加依赖3、AOP相关注解3.1、Aspect3.2、Pointcut3.2.1、execution()3.2.2、annotation() 3.3、Around3.4、Before3.5、After3.6、AfterReturning3.7、AfterThrowing 一、AOP简介 AOP(As…

AOP切面编程的理解

一、什么是Spring的AOP? AOP在spring中又叫“面向切面编程”,它可以说是对传统我们面向对象编程的一个补充,从字面上顾名思义就可以知道,它的主要操作对象就是“切面”,所以我们就可以简单的理解它是贯穿于方法之中&a…

AOP切面使用

一、主要设计注解&#xff1a; Aspect After before Pointcut Around pom文件引入 <!--用于aop切面编程--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> 二、AOP核心…

AOP面向切面

1.什么是Spring的AOP? AOP又叫"面向切面编程",是对传统的面向对象编程的一个补充,主要的操作对象就是"切面 ",可以简单的理解它是贯穿于方法之中,在方法执行前、执行时、执行后、返回值后、异常后要执行的操作。 相当于将我们原本一条线执行的程序在中间切…

【JavaEE】Spring AOP (面向切面)详解

目录&#xff1a; 1. 什么是 Spring AOP&#xff1f;1.1 AOP1.2 使用 AOP 的场景 2. AOP 组成2.1 切面&#xff08;Aspect&#xff09;2.2 连接点&#xff08;Join Point&#xff09;2.3 切点&#xff08;Pointcut&#xff09;2.4 通知&#xff08;Advice&#xff09; 3. AOP 概…

斜杠,反斜杠说明

/ 斜杠 \反斜杠 在window中都用斜杠 反斜杠是用来转译字符串的 eg: \"a\" 输出"a"

斜杠、反斜杠、双斜杠、反双斜杠的区别和使用方法及范围

背景 这边我就找了两篇大神写的文章&#xff0c;讲得非常清晰明了。文章主要讲了一些历史缘故和我们面对各种斜杠时的疑惑。 斜杠’/’ 和反斜杠’’ 深入探讨正斜杠和反斜杠 概念 1. 斜杠"/"是URL地址中用到的分隔符&#xff0c;并且在linux系统中的文件路径也是…

glob.glob()之返回路径的正反斜杆问题

Windows环境下用一个反斜杠就行 绝对路径&#xff1a;D:\PyCharm_code\pytorch_study\xxx 相对路径&#xff1a;.\cifar10_train\**\*.png 以下是踩过的坑&#xff1a;记录下

正反斜杠的区别_正斜杠( / )和反斜杠( \ )的区别

反斜杠“\”是电脑出现了之后为了表示程序设计里的特殊含义才发明的专用标点。所以除了程序设计领域外&#xff0c;任何地方都不应该使用反斜杠。 如何区分正反斜杠 英语&#xff1a;"/" 英文是forward slash, “\" 是backward slash 形象些比喻的话&#xff0c…

正斜杠 “/” 与反斜杠 “\”辨析

文章目录 1. 正斜杠 / / /2. 反斜杠 \ \backslash \3. 正斜杠与反斜杠的区别4. 注意 注意&#xff0c; / / / 为正斜杠(forward slash)&#xff0c;而 \ \backslash \ 为反斜杠(backward slash)。 1. 正斜杠 / / / 斜线是斜线标点符号 / / /。曾经用于标记句点和逗号的斜…

斜杠'/' 和反斜杠'\'

斜杠’/‘和反斜杠’\’ 2019-1-21 引言&#xff1a;从大一进入信息专业&#xff0c;正式接触计算机、代码也有几年了。一开始迷迷糊糊学Ascii码&#xff0c;很多特殊字符都需要转义&#xff0c;比如换行符\n&#xff0c;自那时起我就拎不清转义符是斜杠还是反斜杠&#xff0c;…

全面了解 Python 中的反斜杆

本文全面介绍了 Python 中反斜杆(\)的用法&#xff0c;包括原始字符串和普通字符串&#xff0c;repr() 和 str() ,\ 作为转义符&#xff0c;\ 作为续行符&#xff0c;\ 在字符串转义和正则表达式转义中的过程及注意事项等。阅读本文预计 6 min. 全面了解 Python 中的反斜杆 1. …

教你认识正斜杠(/)与反斜杠(\)

正斜杠&#xff0c;又称左斜杠&#xff0c;符号是 “/” ; 反斜杠&#xff0c;也称右斜杠&#xff0c;符号是 “” 。 经常很迷惑正斜杠与反斜杠到底有何区别&#xff1f;以下是一些总结: 背景了解 &#xff1a; DOS路径&#xff1a; C:\WINDOWS\SETTING …这是反斜杠的作用后…

微信支付,二维码图片解析

微信支付&#xff1a; 后台返回的是数据流&#xff1b; 开始这样&#xff0c;但是不行&#xff0c; 解决&#xff1a;在请求里面加入 ‘responseType’: ‘blob’ , 转换&#xff1a;附上base64转图片 //base64转换base64ImgtoFile(dataurl, filename file) {let arr data…

Apache里如何将图片解析成PHP

首先&#xff0c;如果没有安装PHP&#xff0c;先安装PHP yum install -y php然后进入网站根目录&#xff0c;如果不记得网站根目录&#xff0c;可以去配置文件里找 我的是/mnt/z 所以进入这个目录下&#xff0c;新建一个i.jpg文件 在浏览器里查看这个文件&#xff0c;存在错误…

图像解析力算法—SFR(Spatial Frequency Response)

Mitre SFR 1.4和sfrmat3是基于ISO 12233标准&#xff0c;但在某些方面彼此不同&#xff1a;Mitre SFR 1.4旨在尽可能接近标准&#xff0c; 而sfrmat3包含一些改进&#xff0c;可以获得精确的结果 即使被测试的图像质量极低。 M O R E MTF50&#xff0c;MTF50P 在表示相机图像…

JPEG图像格式解析

参考链接&#xff1a;jpeg图片格式详解_460833359的博客-CSDN博客_jpg文件通常是什么 一、JPEG图像介绍 jpg/jpeg是24位的图像文件格式&#xff0c;也是一种高效率的压缩格式&#xff0c;文件格式是JPEG&#xff08;联合图像专家组&#xff09;标准的产物&#xff0c;是面向连…

图像解析力算法—SFR(Spatial Frequency Response)概念理解

最近这一个月在搞SFR算法--&#xff08;空间频域响应&#xff09;&#xff0c;终于也算是搞出来了&#xff0c;网上关于SFR计算MTF的资料和博客也是比较少&#xff0c;现在就是总结一下&#xff0c;也算是方便后人&#xff0c;篇幅估计会比较长&#xff0c;会分篇慢慢写。 讲到…