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

7 java aop spring spring-mvc spring-aop

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

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

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

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

这是周围建议的序列图:

在此输入图像描述

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

例如,我可以用这种方式定义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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

TNX

Art*_*lan 5

实际上所有这些AOP注释都是作为具体实现公开的AbstractAspectJAdvice.即使它是@AfterThrowing,它AspectJAfterThrowingAdvice仍然存在并被调用:

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

@Around确实拥有更强大的功能,并为最终用户提供更多控制权ProceedingJoinPoint.

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