Java 在SpringAOP中,@Around建议到底是如何工作的?

Java 在SpringAOP中,@Around建议到底是如何工作的?,java,spring,spring-mvc,aop,spring-aop,Java,Spring,Spring Mvc,Aop,Spring Aop,我正在学习Spring AOP模块,我对的建议究竟是如何运作的有些疑问 阅读正式文件: 我可以读到这篇关于周围建议的文章: 环绕建议:围绕连接点(如方法)的建议 调用。这是最有力的建议。围绕建议 可以在方法调用前后执行自定义行为。信息技术 还负责选择是否继续到连接点 或者通过返回其自己的方法来缩短建议方法的执行 返回值或引发异常 这是环绕建议的顺序图: 因此,根据我的理解,我可以定义一个建议(我的自定义行为),它将在切入点指定的关节点前后执行 例如,我可以用以下方式定义一个关于建议的: @Ar

我正在学习Spring AOP模块,我对的建议究竟是如何运作的有些疑问

阅读正式文件:

我可以读到这篇关于周围建议的文章:

环绕建议:围绕连接点(如方法)的建议 调用。这是最有力的建议。围绕建议 可以在方法调用前后执行自定义行为。信息技术 还负责选择是否继续到连接点 或者通过返回其自己的方法来缩短建议方法的执行 返回值或引发异常

这是环绕建议的顺序图:

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

例如,我可以用以下方式定义一个关于建议的

@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;
}
在调用服务方法之前和之后执行已实现的更改行为。是这样吗

我不能完全理解的是,ProceedingJoinPoint参数的准确程度和使用方法

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

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

如果我想试着抓住机会,我应该用什么建议 例外情况

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

但我不确定这一点,因为据我所知,只有在方法抛出异常时才会执行建议。或者在这种情况下,我必须使用**环绕建议*


Tnx

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

try {
    return mi.proceed();
}
catch (Throwable t) {
    if (shouldInvokeOnThrowing(t)) {
        invokeAdviceMethod(getJoinPointMatch(), null, t);
    }
    throw t;
}
@Around
确实具有更强大的功能,并为最终用户提供了更多的控制,以处理
过程连接点


研究所有这些建议类型由您自己决定,但是使用
@Around
您可以访问所有建议类型,尽管您不应该忘记从那里调用
mi.contrace()
。当然,如果你需要按照你的逻辑去做的话。

虽然“研究”春季AOP肯定是出于好意,但你撰写的详尽的理论论文不会让你对这个主题有太多的理解。我的建议是实际编写代码,并尝试一下您的理论,以找出它们是否正确。你的问题太复杂了,同时你可以通过实际的尝试来发现。