当前位置: 首页 > 知识库问答 >
问题:

在Spring AOP中@around建议到底是如何工作的?

颛孙飞鸾
2023-03-14

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

我可以读到关于周围的建议:

围绕通知:围绕连接点的通知,如方法调用。这是最有力的忠告。围绕建议可以在方法调用之前和之后执行自定义行为。它还负责选择是继续连接点,还是通过返回自己的返回值或引发异常来快捷执行建议的方法。

@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;
}

但我不确定,因为据我所知,只有当方法抛出异常时,才执行建议。或者在这种情况下,我必须使用**周围的建议*?

TNX

共有1个答案

陶和歌
2023-03-14

实际上,所有这些AOP注释都是作为AbstractAspectJAdvise的具体实现公开的。即使它是@afterthrowthrough,它的AspectJAfterthrowingAdvision也在那里,并被调用:

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

@around确实具有更强大的功能,为最终用户处理proceedingjoinpoint提供了更多的控制。

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

 类似资料:
  • 我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者

  • 我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。 所以我有了这个模式: 我很清楚这意味着什么: 然后在bean创建阶段执行以下步骤: > 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。 在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。 > 初始化器:如果指示

  • 我有一个自定义注释, 我正在将这个注释用于以下方法, 我在以下方面捕捉事件, @Around建议仅适用于“进程连接点”参数。如果将 XAudit 作为第二个参数传递,则会引发以下错误: 我需要在方面中使用xaud才能访问Xaud的操作。请分享一些关于如何在@周围方面中访问@Xaud值的指针。

  • 问题内容: 我一直在阅读其手册页,但尚未成功弄清其工作原理。在调用system()时,是否分叉了一个新的子进程,并在其中添加了shell二进制文件exec()?但这可能是一个愚蠢的猜测。 问题答案: 是的,system()本质上是传递的命令字符串的fork()和exec()“ sh -c”。可以在此处找到示例实现(来自eglibc,最近来自glibc)。

  • 我在处理Spring boot应用程序项目时注意到,有时在另一台服务器(SQL server)上出现到数据库的连接超时错误。当我尝试使用进行一些脚本迁移时,特别会发生这种情况,但尝试了几次后它仍然工作。 然后我注意到我没有在属性文件中指定。我做了一些研究,发现建议在开发中添加。并在生产中将其更改为:。

  • 这是一个简单的错误:我在对象的格式字符串中使用了而不是。但我完全困惑于我的测试结果与错误的格式字符串。 以下代码: @Jan建议依赖toString()方法可能会有问题,所以我定义了一个日期格式,以与上面相同的代码打印。下面是附加输出: