内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
如果我们使用嵌套调用重载方法如下
public void sample(int a) {
sample(a, 5);
}
public void sample(int a, int offset) {
System.out.println(a + offset);
}
有如下的切入点和建议
@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}
@Around("sampleMethod()")
public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
System.out.println("Advice called");
}
现在,如果调用样本(10),我会得到“建议调用”两次作为输出。这是否意味着poincut会拦截重载的方法?
但请考虑下面的方法没有超载的情况。现在,即使两个方法都匹配切入点表达式,它也只打印一次“Advice called”
public void sample(int a) {
sampleWithOffset(a, 5);
}
public void sampleWithOffset(int a, int offset) {
System.out.println(a + offset);
}
@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}
@Around("sampleMethod()")
public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
System.out.println("Advice called");
}
首先,你的@Around
方面不编译,因为它不返回结果。你可能忘了复制return jp.proceed();
你的代码。
现在,如果调用样本(10),我会得到“建议调用”两次作为输出。这是否意味着poincut会拦截重载的方法?
当然,因为你的切入点匹配两个方法名称。如果你想要不同的行为,改变你的切入点。
但请考虑下面的方法没有超载的情况。现在,即使两个方法都匹配切入点表达式,它也只打印一次“Advice called”
你的陈述是错误的。该方面还打印两次。这是证明:
司机申请:
package de.scrum_master.app;
public class Application {
public void sample(int a) {
sample(a, 5);
sampleWithOffset(a, 9);
}
public void sample(int a, int offset) {
System.out.println(a + offset);
}
public void sampleWithOffset(int a, int offset) {
System.out.println(a + offset);
}
public static void main(String[] args) {
new Application().sample(11);
}
}
方面:
package de.scrum_master.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}
@Around("sampleMethod()")
public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
System.out.println(jp);
return jp.proceed();
}
}
控制台日志:
execution(void de.scrum_master.app.Application.sample(int))
execution(void de.scrum_master.app.Application.sample(int, int))
16
execution(void de.scrum_master.app.Application.sampleWithOffset(int, int))
20