2

鉴于以下示例类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?

我认为我错过了切入点如何与继承交互的一些基本事实,因此引擎盖下的解释/文档可能会有很长的路要走。

4

1 回答 1

2

aspectj文档

在匹配方法执行连接点时,如果执行切入点方法签名指定了声明类型,则切入点将仅匹配在该类型中声明的方法,或者覆盖在该类型中声明或继承的方法的方法。所以切入点

执行(公共无效中间。*())

为返回 void 且没有在 Middle 中声明或继承的参数的公共方法挑选所有方法执行,即使这些方法在 Middle 的子类中被覆盖。所以切入点会在这段代码中挑选出 Sub.m() 的方法执行连接点:

  class Super {
    protected void m() { ... }
  }
  class Middle extends Super {
  }
  class Sub extends Middle {
    public void m() { ... }
  }
于 2011-10-12T10:19:33.983 回答