我使用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
切入点时只执行一次,这一点有什么想法?
答案 0 :(得分:8)
确保您还将切入点限制为执行。否则它将仅限于注释,因此可用于调用和执行(如果AspectJ可以建议调用您的方法,它可以,因为它在你自己的代码)。两者之间的良好比较是:https://stackoverflow.com/a/18149106/2191746
你的切入点看起来像这样:
@AfterThrowing(pointcut="execution(* *(..)) && @annotation(com.core.meta.NotifyOnFailure)", throwing="ex")
不保证语法,因为我手头没有AspectJ编译器。