AspectJのアスペクトの優先順位

今日は、社内でJava関連技術の勉強会があったので参加してきました。今回のテーマはAOPについて。
AspectJについて議論していると、以下のような話題になりました。

AspectJでは、以下のような感じでアスペクトを定義しますが・・・

aspect FooAspect{
  before : call (void Foo.*){
    System.out.println("Foo!");
  }
}

もうひとつ、

aspect BarAspect{
  before : call (void Foo.*){
    System.out.println("Bar!");
  }
}

のように、同じポイントカットに対するアドバイスを含むアスペクトが、複数定義されていた場合は、どちらのアドバイスが先に実行されるのか?

ということで、少し調べたところ、どのアドバイスが実行されるかは実行時にしかわからないようです。アドバイスの実行順序を明確に指定したい場合は、以下のような宣言(特殊なインタータイプ宣言)を記述することで、アスペクトの優先順位を指定することができます。

declare precedence : FooAspect, BarAspect, *;

以上のような宣言を記述しておくことで、はじめにFooAspectのアドバイス、次にBarAspectのアドバイスが実行されるようです。ポイントカットの定義と同じように、"*"(全てのアスペクト)や"+"(すべてのサブ・アスペクト)を使用できるようです。

同一のアスペクト内に定義されているアドバイス同士の優先順位はどのように指定するんだろう・・・。


The AspectJTM Programming Guide
http://www.eclipse.org/aspectj/doc/released/progguide/semantics-declare.html#advice-precedence