对 @AfterThrowing 使用 pointcut=@annotation 的方面是 运行 两次
Aspect using pointcut=@annotation for @AfterThrowing is running twice
我在将 AspectJ 用于使用我的自定义注释的切入点时遇到了一个奇怪的行为。
我使用的切入点是:
@AfterThrowing(pointcut="@annotation(com.core.meta.NotifyOnFailure)", throwing="ex")
我遇到的问题是我的方面被执行了两次但是如果我将切入点修改为:
@AfterThrowing(pointcut="execution(* sendAndReceive(..))", throwing="ex")
按预期运行一次。
我唯一能提高方面的方法是:
@NotifyOnFailure // I want to use this annotation to raise the aspect once
public String sendAndReceive(String serviceUrl)
{
String responseXml = "...";
try
{
throw new Exception("test...");
}
catch(Exception x)
{
ExternalExecutionException ex = new ExternalApiExecutionException("Service failed");
throw ex;
}
finally
{
...
}
return responseXml;
}
知道为什么我的方面在使用我的自定义注释时执行两次而在我使用 execution
切入点时只执行一次吗?
确保你也将切入点限制为执行。否则它只会被限制在注释中,因此被用于 call 和 execution (如果 AspectJ 可以建议调用你的方法,这它可以,因为它在您自己的代码中)。两者之间的一个很好的比较在这里:
您的切入点将如下所示:
@AfterThrowing(pointcut="execution(* *(..)) && @annotation(com.core.meta.NotifyOnFailure)", throwing="ex")
无法保证语法,因为我手边没有 aspectJ 编译器。
我在将 AspectJ 用于使用我的自定义注释的切入点时遇到了一个奇怪的行为。
我使用的切入点是:
@AfterThrowing(pointcut="@annotation(com.core.meta.NotifyOnFailure)", throwing="ex")
我遇到的问题是我的方面被执行了两次但是如果我将切入点修改为:
@AfterThrowing(pointcut="execution(* sendAndReceive(..))", throwing="ex")
按预期运行一次。
我唯一能提高方面的方法是:
@NotifyOnFailure // I want to use this annotation to raise the aspect once
public String sendAndReceive(String serviceUrl)
{
String responseXml = "...";
try
{
throw new Exception("test...");
}
catch(Exception x)
{
ExternalExecutionException ex = new ExternalApiExecutionException("Service failed");
throw ex;
}
finally
{
...
}
return responseXml;
}
知道为什么我的方面在使用我的自定义注释时执行两次而在我使用 execution
切入点时只执行一次吗?
确保你也将切入点限制为执行。否则它只会被限制在注释中,因此被用于 call 和 execution (如果 AspectJ 可以建议调用你的方法,这它可以,因为它在您自己的代码中)。两者之间的一个很好的比较在这里:
您的切入点将如下所示:
@AfterThrowing(pointcut="execution(* *(..)) && @annotation(com.core.meta.NotifyOnFailure)", throwing="ex")
无法保证语法,因为我手边没有 aspectJ 编译器。