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

时间:2015-03-22 10:54:46

标签: java spring spring-mvc aop spring-aop

我正在学习 Spring AOP 模块,我对 AROUND 建议的确切运作方式存有疑问。

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

我可以阅读 AROUND ADVICE

  

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

这是周围建议的序列图:

enter image description here

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

例如,我可以用这种方式定义 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

1 个答案:

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