spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序

2023-11-02

1.AOP的基本概念

切面(Aspect) :通知和切入点共同组成了切面(aspect)。可以从注解方式来理解,代码如下。 


@aspect为类上面的注解——切面 
@pointcut(…)——切入点。为此类内一个空方法上面的注解。可以把拦截的地址表达式表示为方法签名,利于使用起来方便。 
@before@after等——通知。为此类下面的方法上面的注解。 

三者在一块组成一个切面。

连接点(Joinpoint) :程序能够应用通知的一个point,这些“point”就是连接点,例如方法被调用时、异常被抛出时等等。——可以理解为被aop拦截的类或者方法就是连接点。

通知(Advice) :通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。——可以理解为被注解有@Before等advice注解的安全校验的方法,拦截了过来的请求要做什么逻辑的校验。

切入点(Pointcut) :通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称。——可以理解为切面切向哪里?是个类或者某层的包路径。 
目标对象(Target Object) :即被通知的对象。 
AOP代理(AOP Proxy) 在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理;反之,采用CGLIB代理。 
织入(Weaving)把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机: 
  (1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才能做到,例如AspectJ的织入编译器; 
  (2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码; 

  (3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理是使用了JDK的动态代理。

2 注解说明

2.1 @Aspect

作用是把当前类标识为一个切面供容器读取

2.2 @Before
标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有

2.3 @AfterReturning

后置增强,相当于AfterReturningAdvice,方法正常退出时执行

2.4 @AfterThrowing

异常抛出增强,相当于ThrowsAdvice

2.5 @After

final增强,不管是抛出异常或者正常退出都会执行

2.6 @Around

环绕增强,相当于MethodInterceptor

2.7 @DeclareParents

引介增强,相当于IntroductionInterceptor

3 advice(通知)注解的执行先后顺序

这里说下简单情况——针对一个方法只被一个aspect类拦截时,aspect类内部的 advice 将按照以下的顺序进行执行情况如下:

执行到核心业务方法或者类时,会先执行AOP。在aop的逻辑内,先走@Around注解的方法。然后是@Before注解的方法,然后这两个都通过了,走核心代码,核心代码走完,无论核心有没有返回值,都会走@After方法。然后如果程序无异常,正常返回就走@AfterReturn,有异常就走@AfterThrowing。

4 更多切点函数

除了execution(),Spring中还支持其他多个函数,这里列出名称和简单介绍,以方便根据需要进行更详细的查询

4.1 @annotation()

表示标注了指定注解的目标类方法

例如 @annotation(org.springframework.transaction.annotation.Transactional) 表示标注了@Transactional的方法

4.2 args()

通过目标类方法的参数类型指定切点

例如 args(String) 表示有且仅有一个String型参数的方法

4.3 @args()

通过目标类参数的对象类型是否标注了指定注解指定切点

如 @args(org.springframework.stereotype.Service) 表示有且仅有一个标注了@Service的类参数的方法

4.4 within()

通过类名指定切点

如 with(examples.chap03.Horseman) 表示Horseman的所有方法

4.5 target()

通过类名指定,同时包含所有子类

如 target(examples.chap03.Horseman)  且Elephantman extends Horseman,则两个类的所有方法都匹配

4.6 @within()

匹配标注了指定注解的类及其所有子类

如 @within(org.springframework.stereotype.Service) 给Horseman加上@Service标注,则Horseman和Elephantman 的所有方法都匹配

4.7 @target()

所有标注了指定注解的类

如 @target(org.springframework.stereotype.Service) 表示所有标注了@Service的类的所有方法

4.8 this()

大部分时候和target()相同,区别是this是在运行时生成代理类后,才判断代理类与指定的对象类型是否匹配

参考博文: 
1. 小曹学spring–基于@AspectJ和Schema的AOP  
2. 彻底征服 Spring AOP 之 理论篇  
3. 利用Spring AOP自定义注解解决日志和签名校验  
4. Spring AOP @Before @Around @After 等 advice 的执行顺序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序 的相关文章

随机推荐

  • 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。到第10天早上时,只剩下一个,求第一天有多少桃子。

    猴子吃桃问题 猴子第一天摘下若干个桃子 当即吃了一半 又多吃了一个第二天早上又将剩下的桃子吃掉一半 又多吃了一个 到第10天早上时 只剩下一个 求第一天有多少桃子 我的思路 用逆向思维推测第一天 由题可知第10天时桃子数量为1 根据规律 第
  • Docker 开启 buildx 多CPU架构镜像制作

    Docker开启buildx多CPU架构镜像制作 buildx简介 关于QEMU 系统限制 查看Linux内核版本 查看Docker版本 Docker开启实验特性 启用 binfmt misc 来运行非本地架构 Docker 镜像 检查 Q
  • Spring MVC+Maven 实现同一项目的前端和后台交互

    在做前端和后台交互时 首先得有一个建立完毕的spring MVC项目 这里我以Maven Spring MVC的HelloWord工程来示例 当然你也可以在你已有的Spring MVC工程下进行操作 建立Spring MVC的HelloWo
  • 【论文随笔】强化学习与奖励机 LTL and Beyond: Formal Languages for Reward Function Specification in RL

    前言 最近对强化学习比较感兴趣 来读一读时序逻辑与强化学习交叉的文章 P S 随着毕业设计的结束 最近恢复了一波旧帖子 另外新建了个人网站 可能慢慢把笔记都移到个人网站上 但就目前而言还是CSDN的编辑器用着更顺手一些些 主要参考文献 Ca
  • python机器学习入门到精通--实战分析(三)

    利用sklearn分析鸢尾花 前面两篇文章提到了机器学习的入门的几个基础库及拓展练习 现在我们就对前面知识点进行汇总进行一个简单的机器学习应用 并构建模型 练习即假定一名植物专家收集了每一朵鸢尾花的测量数据 花瓣的长度和宽度以及花萼的长度和
  • -bash: netstat: 未找到命令

    linux命令报错信息 bash netstat 未找到命令 root localhost netstat anp bash netstat 未找到命令 原因分析 缺少Net tools Net tools 包含一系列程序 是构成了 Lin
  • 本地安装node.js安装,使用npm下载插件

    操作系统 windows10 开发工具 VS Code 1 下载node js文件 全程下一步即可 2 打开vscode 运行终端 此处打开的额终端路径是你当前的项目根目录 node中自带npm 所以安装号node就已经安装号 npm了 使
  • 白鲸开源代立冬:一年5个孵化项目来自于中国,佛系Apache如何帮助中国开源立足全球?

    近两年 在Apache等顶尖开源基金会中涌现出很多像SeaTunnel这样的国产开源项目 但由于起步较晚 中国开源与海外还存在明显差距 那么中国开源该如何追赶 本期 开源访谈录 邀请到了Apache mentor代立冬来分享他的见解 本期受
  • Ubuntu 20.04vscode配置C语言

    网上好多都是乱七八糟的 调的我心烦 我自己把自己配置成功的拿出来方在这里给大家看了 vscode配置C语言实际上就是每个文件夹修改一下launch json和tasks json文件 launch json version 0 2 0 co
  • Google分布式三篇论文--MapReduce

    MapReduce 超大机群上的简单数据处理 摘要 MapReduce是一个编程模型 和处理 产生大数据集的相关实现 用户指定一个map函数处理一个key value对 从而产生中间的key value对集 然后再指定一个reduce函数合
  • SpringBoot2.0之整合Apollo

    SpringBoot2 0之整合Apollo Spring Boot客户端对接阿波罗服务器端 核心源码都在这个压缩包里面 封装好了环境 运行shell脚本就ok了 下面进入到本地maven仓库 远程仓库apollo的jar包 只能打包到本地
  • 【路径规划】基于模糊逻辑系统实现车辆的自主导航附matlab代码

    1 内容介绍 在过去的30年 用于城市地面交通工具中自动驾驶技术的开发已经得到了飞速的发展 目前 现代自主驾驶车辆已具备一定感知车辆周围环境的能力 比如根椐分类所分析对象的类型并进行检测 观测周身环境的变化并评估对象的移动可能性 在遵循交通
  • 交换瓶子

    交换瓶子 贡献者 programmer ada 有N个瓶子 编号 1 N 放在架子上 比如有5个瓶子 2 1 3 5 4 要求每次拿起2个瓶子 交换它们的位置 经过若干次后 使得瓶子的序号为 1 2 3 4 5 对于这么简单的情况 显然 至
  • SpringBoot Controller 提取Post请求中Body的参数问题——驼峰命名规则

    正常在Controller方法中使用 RequestBody 类 对象进行参数接收 通过ApiFox对对应接口发起请求 但控制台打印内容为空 原因 ApiFox中设置json格式的body参数时 变量名未遵循驼峰命名规则 类似于printE
  • Qt样式表的使用

    Qt中可以灵活的使用层叠样式表 CSS 其语法和CSS很相似 因为HTML CSS的灵活性 所以可以很方便的为QT界面设计自己需要的外观 除了子类化Style类 使用QT样式表 QStyleSheet 是另一种快速改变QT程序UI风格的方法
  • java开发记录-微信二维码支付

    关于微信二维码支付的一点点总结 如上一个博客所说 开始开发前需要前往官网进行一系列的接入 从而得到相关的appid 密钥 本次的开发中 使用谷歌zxing实现将支付链接字符串转为二维码 附上相关依赖
  • 用STM32F103输出一路PWM波形

    用STM32F103输出一路PWM波形 一 PWM简介 二 STM32F1 PWM介绍 三 PWM输出配置步骤 四 PWM代码 Keil仿真 一 PWM简介 PWM是 Pulse Width Modulation 的缩写 中文意思就是脉冲宽
  • 6个超酷智能交互案例分享

    本次的案例分享主要集中在智能交互方向 主要集中在4个方面 智能设备如何增强情感化设计 全息投影如何运用在实际商业领域 智慧家庭的终端设计如何陪伴宠物 私域流量借助图像识别的智能营销玩法 机器人难道只能屏幕脸表达情感 只会嘤嘤嘤求抱抱的机器人
  • 亚马逊云科技发布全新数据管理服务Amazon DataZone

    亚马逊云科技在2022 re Invent全球大会上宣布 推出一项全新的数据管理服务Amazon DataZone 它可以让客户更快 更轻松地对存储在亚马逊云科技 客户本地和第三方来源的数据进行编目 发现 共享和治理 借助Amazon Da
  • spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序

    1 AOP的基本概念 切面 Aspect 通知和切入点共同组成了切面 aspect 可以从注解方式来理解 代码如下 aspect为类上面的注解 切面 pointcut 切入点 为此类内一个空方法上面的注解 可以把拦截的地址表达式表示为方法签