@Around建议究竟如何在Spring AOP中运行?

我正在研究Spring AOP模块,我对AROUND建议的确切运作方式有些怀疑。

阅读官方文档: http : //docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

我可以阅读有关AROUND ADVICE的内容

围绕建议:围绕连接点的建议,例如方法调用。 这是最有力的建议。 around通知可以在方法调用之前和之后执行自定义行为。 它还负责选择是继续加入点还是通过返回自己的返回值或抛出exception来快速建议的方法执行。

这是周围建议的序列图:

在此处输入图像描述

因此,根据我的理解,我可以定义一个建议(我的自定义行为),它将在切入点指定的关节点之前和之后执行。

例如,我可以通过这种方式定义AROUND ADVICE

@Around(“execution(@example.Cacheable * rewards.service..*.*(..))”) public Object cache(ProceedingJoinPoint point) throws Throwable { Object value = cacheStore.get(cacheKey(point)); if (value == null) { value = point.proceed(); cacheStore.put(cacheKey(point), value); } return value; } 

在调用服务方法之前和之后执行已实现的chaching行为。 这样对吗?

我无法完全理解的是它是如何使用ProceedingJoinPoint点参数的。

根据我的理解,它用于选择执行或不执行特定操作但具体如何工作?

另一个疑问是如何正确使用AOP建议如何回答以下问题:

如果我想尝试捕获exception,我必须使用哪些建议?

我认为在这种情况下,答案是使用After throw advice,因为当匹配的方法执行通过抛出exception退出时,通知会执行。

但是我不确定它,因为根据我的理解, 只有在方法抛出exception时才会执行建议。 或者在这种情况下我必须使用** AROUND ADVICE *?

TNX

实际上,所有这些AOP注释都是作为AbstractAspectJAdvice具体实现公开的。 即使它是@AfterThrowing ,它的AspectJAfterThrowingAdvice那里并且无论如何被调用:

 try { return mi.proceed(); } catch (Throwable t) { if (shouldInvokeOnThrowing(t)) { invokeAdviceMethod(getJoinPointMatch(), null, t); } throw t; } 

@Around确实拥有更强大的function,并为最终用户提供更多控制权来处理ProceedingJoinPoint

它可以学习所有这些建议类型,但是使用@Around可以达到所有这些类型,尽管你不应该忘记从那里调用mi.proceed() 。 当然,如果需要按照你的逻辑做到这一点。