我正在学习 Spring AOP 模块,我对 AROUND 建议的确切运作方式存有疑问。
阅读官方文件:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html
我可以阅读 AROUND ADVICE :
围绕建议:围绕连接点(例如方法)的建议 调用。这是最有力的建议。围绕建议 可以在方法调用之前和之后执行自定义行为。它 还负责选择是否继续加入点 或者通过返回自己的方法来快速建议的方法执行 返回值或抛出异常。
这是周围建议的序列图:
因此,根据我的理解,我可以定义一个建议(我的自定义行为),该建议将在切入点指定的关节点之前和之后执行。
例如,我可以用这种方式定义 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 point 参数究竟是如何使用的。
根据我的理解,它用于选择执行或不执行特定操作但具体如何工作?
另一个疑问是如何正确使用AOP建议如何回答以下问题:
如果我想尝试捕获,我必须使用哪些建议 异常?
我认为在这种情况下,答案是使用抛出建议后,因为当匹配的方法执行通过抛出异常退出时执行建议。
但我不确定,因为根据我的理解,只有在方法抛出异常时才会执行建议。或者在这种情况下我必须使用** AROUND ADVICE *?
TNX
答案 0 :(得分:5)
实际上,所有这些AOP注释都是AbstractAspectJAdvice
的具体实现。即使它是@AfterThrowing
,它的AspectJAfterThrowingAdvice
仍然在那里并且无论如何都会被调用:
try {
return mi.proceed();
}
catch (Throwable t) {
if (shouldInvokeOnThrowing(t)) {
invokeAdviceMethod(getJoinPointMatch(), null, t);
}
throw t;
}
@Around
确实拥有更强大的功能,并为最终用户提供更多控制权,以便与ProceedingJoinPoint
打交道。
它可以研究所有这些建议类型,但@Around
可以覆盖所有这些建议类型,但您不应该忘记从那里拨打mi.proceed()
。当然,如果需要按照你的逻辑做到这一点。