AspectJから学ぶアスペクト指向の理解:アスペクト指向のバリエーション解説(2)(2/3 ページ)
第1回「アスペクト指向の基礎とさまざまな実装」ではアスペクト指向とAOPの概要について解説したが、今回からはAOPのさまざまな実装を取り上げていきたい。まず始めに紹介するのはAspectJである。
AspectJプログラミング
それでは、もう少し詳しくアスペクトコードを見ていこう。もう一度先ほどのGreetingAspectを見てほしい。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
AspectJを使ったプログラミングを書くには次の3つのキーワードを理解する必要がある。
- 「ジョインポイント(Join Point)」
- 「ポイントカット(Pointcut)」
- 「アドバイス(Advice)」
ジョインポイントはアスペクトをウィーブする「コード上のポイント」であり、1つ以上のジョインポイントをまとめた定義がポイントカットである。アドバイスは実際にウィーブするアスペクトの処理定義であり、ポイントカットに対してアドバイスを定義しておくことで、そのポイントカットで定義されている各ジョインポイントに対してアドバイスの処理が実行されることになる。
このGreetingAspectではmessage()というポイントカットを定義している(3行目)。ポイントカットを定義するための構文は次のようになる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ポイントカット定義の部分には次の表にあるような定義済みのポイントカットタイプを指定することができる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このポイントカットタイプの引数に対象クラスを指定することで、ジョインポイントが決定される。例えば、GreetingAspectでは次のようにジョインポイントが指定されている。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
これはMessengerクラスのprintMessage() メソッドの呼び出しをジョインポイントとして指定し、そのジョインポイントに対して「message()」という名前のポイントカットを定義していることになる。また、ジョインポイントの指定には、次のようなワイルドカードとオペレータを使用することができる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
beforeアドバイスは「事前処理」を定義するためのアドバイスである。つまりジョインポイントが実行される前に織り込む処理の定義である。反対にafterアドバイスは「事後処理」を定義する。つまりジョインポイントが実行された後に織り込む処理の定義である。aroundアドバイスはbeforeアドバイスやafterアドバイスに比べるとやや複雑である。aroundアドバイスはジョインポイントにおける処理に代わって実行される。
GreetingAspectでは5行目から7行目にbeforeアドバイスを定義しており、先に定義してあるmessage()ポイントカットをその対象としている。そして実際にウィービングする処理となる「Hello, 」の出力をJavaのプログラミングコードを使って記述している。つまりmessage()ポイントカットで指定されているジョインポイント(printMessage()メソッドの呼び出し)に対して事前処理として「System.out.print("Hello, ");」を実行するというわけである。
ここまでで簡単にAspectJプログラミングについて説明したが、実際にはもう少し複雑な言語仕様が取り決められているため、詳細はAspectJのサイトで公開されているリファレンスを参照していただきたい。
では次に、もう少し実践的なAOP導入の例として「ロギング」を紹介する。
Copyright © ITmedia, Inc. All Rights Reserved.