首页 > 其他分享 >springBoot AOP 深入原理,及 @Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序

springBoot AOP 深入原理,及 @Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序

时间:2024-03-30 14:55:57浏览次数:23  
标签:Around 连接点 通知 advice After 代理 切面 AfterReturn 方法

连接点(Joinpoint) :
程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。——可以理解为被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的动态代理。

通知(Advice)类型的说明
@Before 前置通知(Before advice) :在某连接点(JoinPoint)——核心代码(类或者方法)之前执行的通知,但这个通知不能阻止连接点前的执行。为啥不能阻止线程进入核心代码呢?因为@Before注解的方法入参不能传ProceedingJoinPoint,而只能传入JoinPoint。要知道从aop走到核心代码就是通过调用ProceedingJionPoint的proceed()方法。而JoinPoint没有这个方法。
这里牵扯区别这两个类:Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法。proceed很重要,这个是aop代理链执行的方法。暴露出这个方法,就能支持 aop:around 这种切面(而其他的几种切面只需要用到JoinPoint,这跟切面类型有关), 能决定是否走代理链还是走自己拦截的其他逻辑。建议看一下 JdkDynamicAopProxy的invoke方法,了解一下代理链的执行原理。这样你就能明白 proceed方法的重要性。
@After 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
@AfterReturning 返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况。
@Around 环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。这时aop的最重要的,最常用的注解。用这个注解的方法入参传的是ProceedingJionPoint pjp,可以决定当前线程能否进入核心方法中——通过调用pjp.proceed();
@AfterThrowing 抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。


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

原文链接:https://blog.csdn.net/fcclzydouble/article/details/120013100

标签:Around,连接点,通知,advice,After,代理,切面,AfterReturn,方法
From: https://www.cnblogs.com/isme-zjh/p/18105488

相关文章

  • @Around(value =execution(* )) 的理解
    我们总是听到AOP,又称面向切面编程,那面向切面编程在日常开发中的应用场景有哪些呢?我们来一起梳理一下:什么时候会用到面向切面编程呢?其实就是有一些公共的逻辑,需要在很多地方用到,那这些代码如果在每个位置都写一下的话,当需要修改的时候,又必须将这些代码全都找出来进行修改,就会......
  • [983] Add a notification after finishing the Python script
    ref:HowtoimplementaPythondesktopnotifierusingtheplyermoduleYoucangenerateanotificationafteryourPythoncodefinishesexecutingusingvariousmethods.Hereareafewoptions:UsingPlyer(Cross-Platform):Installthe plyer libraryusi......
  • [LeetCode] 2789. Largest Element in an Array after Merge Operations
    Youaregivena0-indexedarraynumsconsistingofpositiveintegers.Youcandothefollowingoperationonthearrayanynumberoftimes:Chooseanintegerisuchthat0<=i<nums.length-1andnums[i]<=nums[i+1].Replacetheelementnums......
  • 题解 CF1523H Hopping Around the Array
    \(\texttt{link}\)题意数轴上有\(n\)个点,每个点有属性\(a_i\),在第\(i\)个点可以花费\(1\)的步数移动至\([i,i+a_i]\)中任意一个点。定义一次操作为选出一个\(i\),使\(a_i\getsa_i+1\)。\(q\)组询问,每次给出\(l,r,k\),求有\(k\)次操作机会时,从第\(l\)个点走到......
  • Go 100 mistakes - #76: time.After and memory leaks
       ......
  • Minecraft Fabric模组开发时遇到报错-Failed download after 3 attempts
    MinecraftFabric模组开发时遇到报错-Faileddownloadafter3attempts遇到的主要报错如下(当然以下只是一部分报错)Aproblemoccurredconfiguringrootproject'tuuorial_mod'.Failedtonotifyprojectevaluationlistener.FailedtosetupMinecraft,java.io.Unchecke......
  • VideoCrafter2:腾讯AI如何用少量数据生成更清晰视频
    引言去年10月,腾讯发布了VideoCrafter1模型,引起了广泛关注。短短3个月后,腾讯AI实验室再次创新,推出了VideoCrafter2模型。这一次,他们克服了高质量视频扩散模型的数据限制,仅使用有限数据就实现了显著改进,既保留了良好的动态效果,又大幅提升了视频质量。VideoCrafter2模型概述VideoCraft......
  • Failed to connect to github.com port 443 after 21051 ms: Couldn't connect to ser
    使用git克隆远程仓库的代码,总是显示连接不上服务器,https和ssh都试了还是连不上。打开cmd去pinggithub.com也是显示连接超时,但是浏览器里面还是可以正常访问github。网上搜了一下,使用"ipconfig/flushdns"在cmd里面刷新一下本地的dns缓存,还是不行。最后找到一个方法,修改本地hosts文......
  • Adobe After Effects 2024:让你的创意动起来 mac/win版
    AdobeAfterEffects2024是一款专业的数字视觉效果、合成和运动图形软件,被广泛应用于电影、电视、广告和网络媒体等领域。它能够帮助用户快速高效地将创意转化为令人惊叹的视觉效果,是视觉艺术家的首选工具之一。→→↓↓载AdobeAfterEffects2024mac/win版在AdobeAfterE......
  • CodeForces 1609G A Stroll Around the Matrix
    洛谷传送门CF传送门我独立做出一道*3000?考虑对于单次询问,除了\(O(nm)\)的dp,有没有什么方法能快速算出答案。发现若\(a_{i+1}-a_i<b_{j+1}-b_j\)则\(i\getsi+1\),否则\(j\getsj+1\)是最优的。这个贪心的证明不难,考虑当前新走到某一行或某一列的贡献......