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

アスペクトドキュメントから:

メソッドと実行の結合ポイントを照合するときに、実行ポイントカット メソッド シグネチャが宣言型を指定している場合、ポイントカットは、その型で宣言されたメソッド、またはその型で宣言または継承されたメソッドをオーバーライドするメソッドのみに一致します。だからポイントカット

execution(public void Middle.*())

void を返し、Middle で宣言または継承された引数を持たない public メソッドのすべてのメソッド実行を選択します。これらのメソッドが 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 に答える