给定my.package中的以下示例类...
public class Foo {
public void logicNotInBar() {/*code*/}
public void logicBarOverrides() {/*code*/}
}
public class Bar extends Foo {
public void logicBarOverrides() {/*code*/}
}以及下面的Spring-AOP切入点...
<aop:pointcut id="myPointcutAll" expression="execution(* my.package.*.*(..))" />
<aop:pointcut id="myPointcutFoo" expression="execution(* my.package.Foo.*(..))" />
<aop:pointcut id="myPointcutBar" expression="execution(* my.package.Bar.*(..))" />对Bar实例上的上述切入点应用建议的结果是什么?尤其是..。
Bar bar = new Bar();
bar.logicNotInBar(); // will myPointcutBar advice trigger?
bar.logicBarOverrides(); // is myPointcutFoo ignored here?我想我遗漏了一些关于切入点如何与继承交互的基本事实,所以一个底层的解释/文档可能会有很大的帮助。
发布于 2011-10-12 18:19:34
来自aspectj documentation
匹配方法执行连接点时,如果执行切入点方法签名指定了声明类型,则切入点将只匹配该类型中声明的方法,或覆盖该类型中声明或继承的方法的方法。所以切入点
执行(public void Mid.*())
挑选返回void且没有参数的公共方法的所有方法执行,这些方法是在中间声明的或由中间继承的,即使这些方法在中间的子类中被覆盖。因此,切入点将为以下代码中的Sub.m()选择方法执行连接点:
class Super {
protected void m() { ... }
}
class Middle extends Super {
}
class Sub extends Middle {
public void m() { ... }
}https://stackoverflow.com/questions/7727454
复制相似问题