gpt4 book ai didi

java - Spring 和 AOP - 处理每个抛出的异常

转载 作者:行者123 更新时间:2023-12-02 11:38:22 24 4
gpt4 key购买 nike

我需要拦截每个抛出的异常并对其执行某些操作。我正在使用这部分代码:

@Aspect
@Component
class Advice
{
@AfterThrowing(pointcut = "execution(* mail.service..*.*(..))", throwing = "throwable")
public void sendError(Throwable throwable)
{
System.out.println("exception thrown");
}
}

这在某种程度上并没有像我预期的那样工作。这个切入点似乎只“影响”公共(public)方法(我想这是 Spring AOP 所期望的?),但它仅在某些方法中打印字符串,例如,在我的 Spring 配置类中声明的方法(我猜是因为它们在应用程序启动之前初始化)而不是在其他应用程序中。

我试图让这个方面适用于任何抛出的异常,但没有成功。这是否与我使用 Spring AOP 而不是完整的 AspectJ 有关?

另外,我的项目是用Kotlin编写的(我用Java编写了方面,所以IJ可以支持它),这对使用AspectJ有影响吗?我在让它工作时遇到了很多麻烦(因为最终类),我想知道当我开始编写更高级的 AspectJ 代码时是否会变得更加困难。

谢谢!

最佳答案

是的,Spring AOP 仅适用于 Spring 组件,并且仅适用于公共(public)方法(加上 CGLIB 代理的 protected 和包保护的方法)。它也不适用于像 this.doSomething() 这样的自调用方法,因为这些方法不通过代理。仅当您的异常升级到通过代理调用的方法之外时,Spring AOP 才能够拦截它。

使用 LTW(加载时编织)或 CTW(编译时编织)的 AspectJ 没有任何这些限制,而且您还可以处理构造函数中的异常,而不仅仅是方法中的异常。

以前从未使用过 Kotlin,我无法告诉您可能存在什么问题,但最终类不应该成为问题,因为 AspectJ 直接检测类的字节码,而不是通过代理。尝试一下吧。

顺便说一句,以防万一您因为 AOP 而只使用 Spring:您根本不需要使用 Spring 即可将 AOP 应用于您的类,因为 AspectJ 100% 独立于 Spring。您可以选择一起使用或不一起使用它们。例如,我从不使用 Spring,而只使用 Java SE + AspectJ。

关于java - Spring 和 AOP - 处理每个抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com