当前位置: 首页 > ops >正文

Spring AOP执行原理源码解析

对【com.example.demo.TestAspect#aopTest】连接点增加了五个通知

在调用【com.example.demo.A#testAop()】(用户自定义)方法时,Cglib拦截器对其进行了拦截

可以看到执行顺序分别是环绕前置,前置,环绕后置,后置,返回后置

有异常的情况下执行顺序分别是环绕前置,前置,环绕后置,后置,异常后置

在拦截时生成了【org.springframework.aop.framework.CglibAopProxy.CglibMethodInvocation】对象,这是贯穿整条拦截器链的重要类,该类继承了【org.aopalliance.intercept.Joinpoint】一个重要的方法【org.aopalliance.intercept.Joinpoint#proceed】

在执行【org.aopalliance.intercept.Joinpoint#proceed】方法时(实际是重写方法【org.springframework.aop.framework.ReflectiveMethodInvocation#proceed】),当前对象中的拦截器链【org.springframework.aop.framework.ReflectiveMethodInvocation#interceptorsAndDynamicMethodMatchers】有刚才在对【com.example.demo.TestAspect#aopTest】连接点增加的五个通知,注意下这个链的顺序,随后调用了【org.aopalliance.intercept.MethodInterceptor#invoke】

SpringAOP拦截器链的原理类似栈的方式,先进后出,最开始执行的是【org.springframework.aop.aspectj.AspectJAfterThrowingAdvice】,会看到【org.aopalliance.intercept.MethodInterceptor#invoke】的参数是【org.aopalliance.intercept.MethodInvocation】,方法内结果执行的还是【org.aopalliance.intercept.Joinpoint#proceed】

所以看到拦截器链的核心原理就是【org.aopalliance.intercept.Joinpoint#proceed】和【org.aopalliance.intercept.MethodInterceptor#invoke】两个方法,所以在调用【com.example.demo.A#testAop】方法时的链路是这样的,都是通过【org.aopalliance.intercept.Joinpoint#proceed】来贯穿整个链路

http://www.xdnf.cn/news/12832.html

相关文章:

  • 上位机知识篇---dialoutuucp组
  • Windows设置之网络路由
  • 手写RPC框架<一> SPI机制
  • 华为云之使用云服务器搭建Leanote云笔记本【玩转华为云】
  • MS8911S/8921S/8922M/8931S 是一款具有内部迟滞的高速比较器
  • spring task定时任务快速入门
  • 【LangChain4J】LangChain4J 第四弹:RAG 的多种实现方式
  • 《汇编语言》第16章 直接定址表——实验16 编写包含多个功能子程序的中断例程
  • 【时时三省】(C语言基础)局部变量和全局变量例题
  • 贝叶斯定理与医学分析(t检验场景)
  • 【量化】策略交易 - 均线策略(Moving Average Strategy)
  • 如何在Redhat Linux7.9下安装配置MySQL
  • 历史数据分析——辽港股份
  • Java高频面试之并发编程-24
  • Semantic-SAM: Segment and Recognize Anything at Any Granularity
  • 大模型如何选型?嵌入模型如何选型?
  • 【PhysUnits】17.2 配套变量结构体 Var(variable.rs)
  • 一套个人知识储备库构建方案
  • UE的AI行为树Selector和Sequence如何理解
  • 数据结构——D/串
  • comfyui 工作流中 图生视频 如何增加视频的长度到5秒
  • C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
  • Vivado软件开发流程操作详解
  • 五年级数学知识边界总结思考-下册
  • 【会员专享数据】1980—2022年中国逐日月年潜在蒸散发栅格数据
  • JavaScript 数组学习总结
  • Spyglass:跨时钟域同步(时钟门控单元)
  • eBPF系列--BCC中提供的BPF maps高级抽象如何映射到内核的BPF maps?
  • 【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化
  • 比较一组结构之间的变换