【问题标题】:How exactly does an @Around advice work in Spring AOP?@Around 建议在 Spring AOP 中究竟是如何工作的?
【发布时间】:2015-03-22 10:54:46
【问题描述】:

我正在研究 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;
}

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

我无法完全理解的是 ProceedingJoinPoint 点参数究竟是如何以及如何使用的。

据我了解,它用于选择是否执行特定操作,但具体如何工作?

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

如果我想尝试捕捉,我必须使用哪些建议 例外?

我认为在这种情况下,答案是使用 After throwing 建议,因为该建议会在匹配的方法执行通过抛出异常退出时执行。

但我不确定,因为据我了解,只有在方法引发异常时才会执行建议。或者在这种情况下,我必须使用 **AROUND ADVICE* ?

Tnx

【问题讨论】:

  • 虽然“学习”Spring AOP 肯定表现出良好的意图,但您撰写详尽的理论论文不会让您深入理解该主题。我的建议是实际编写代码并尝试一下您的理论,以找出它们是对还是错。您的问题是如此详尽,同时您可以通过实际尝试发现。

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


【解决方案1】:

实际上所有这些 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()。当然,如果需要按照您的逻辑这样做。

【讨论】:

    猜你喜欢
    • 2022-08-20
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2023-03-16
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多