给定以下示例类my.package…
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?
我想我缺少切入点如何与继承交互的一些基本真理,因此幕后的解释/文档可能会走很长一段路。
从aspectj文档中:
在匹配方法执行连接点时,如果执行切入点方法签名指定了声明类型,则切入点将仅匹配该类型中声明的方法或覆盖该类型中声明或继承的方法的方法。所以切入点 执行(公共无效的中间*()) 选择公共方法的所有方法执行,这些方法将返回void并且没有在Middle中声明或继承的参数,即使这些方法在Middle的子类中被覆盖也是如此。因此,切入点将在以下代码中为Sub.m()选择方法执行连接点:
在匹配方法执行连接点时,如果执行切入点方法签名指定了声明类型,则切入点将仅匹配该类型中声明的方法或覆盖该类型中声明或继承的方法的方法。所以切入点
执行(公共无效的中间*())
选择公共方法的所有方法执行,这些方法将返回void并且没有在Middle中声明或继承的参数,即使这些方法在Middle的子类中被覆盖也是如此。因此,切入点将在以下代码中为Sub.m()选择方法执行连接点:
class Super { protected void m() { ... } } class Middle extends Super { } class Sub extends Middle { public void m() { ... } }