@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()
。 当然,如果需要按照你的逻辑做到这一点。