連載
» 2004年12月17日 12時00分 公開

アスペクト指向のバリエーション解説(2):AspectJから学ぶアスペクト指向の理解 (3/3)

[米山学(クロノス 専務取締役),@IT]
前のページへ 1|2|3       

ロギングへの応用

 ソフトウェア開発にはさまざまな横断的関心事があるが、AOPを説明する際によく取り上げられるのが「ロギング」という横断的関心事である。前回の記事でも少し触れたが、ログを取るという「関心事」はソフトウェア開発にとって非常に重要なものではあるが、それは本来のビジネスロジックではなく、またあらゆるコード内に「散在」してしまうという側面を持っている。

 例えば、先ほどのMessengerクラスとTesterクラスのすべてのメソッド内で、そのメソッドが呼ばれたことを確かめるためのログ出力が必要となった場合、次のようにコードを修正しなければならない(赤字部分を追加)。この例では標準ライブラリのロギングAPIを使っているが、Log4jやCommons Loggingを用いても同じである。

import java.util.logging.*;

public class Messenger {

    static Logger logger = Logger.getLogger("trace");

     public static void printMessage(String message) {

       logger.logp(Level.INFO, "Messenger", "printMessage", "Entering");

        System.out.println(message);

    }

}

リスト6 Messengerクラス(ログ出力用コードを追加)


import java.util.logging.*;

public class Tester {

    static Logger logger = Logger.getLogger("trace");

    public static void main(String[] args) {

      logger.logp(Level.INFO, "Tester", "main", "Entering");

       Messenger.printMessage("AspectJ");

    }

}

リスト7 Testerクラス(ログ出力用コードを追加)


 上記のようにログ出力コードを追加した後プログラムを実行すれば、呼び出されたメソッドの情報が期待どおりログとして出力される。

> java Tester
2004/11/03 22:48:37 Tester main
情報 : Entering
2004/11/03 22:48:37 Messenger printMessage
情報 : Entering
AspectJ

実行結果(AspectJを使わない場合)

 この例のようにクラスがたった2つで、メソッドも2つだけである場合にはそれほど問題はない。しかし、実際のアプリケーションでは膨大な数のクラスとメソッドがあるはずだ。それらすべてのメソッドに、同じような(それでいて微妙に異なる)ロギング用コードを挿入していくことはあまりお勧めできることではない。メンテナンス性が悪いだけでなく、バグを混入させてしまう原因にもなるからだ。

 このような問題はAOPによって解決することができる。「ロギング」という「アスペクト」を既存クラスにウィーブすることで、先ほどのようなロギング用コードを挿入する必要がなくなるのである。では実際に、AspectJを使ってそれを試してみよう。それぞれのクラスに挿入したロギングコードは取っ払ってしまい、代わりに次のような「LoggingAspect」を作成する。このアスペクトはすべてのクラスのメソッド実行(ジョインポイント)をキャプチャし、ログを出力する。

import java.util.logging.*;

import org.aspectj.lang.*;

public aspect LoggingAspect {

    static Logger logger = Logger.getLogger("trace");

    pointcut loggingMethods() : execution(* *.*(..)) && !within(LoggingAspect);

    before() : loggingMethods() {

        Signature s = thisJoinPointStaticPart.getSignature();

        logger.logp(Level.INFO, s.getDeclaringType().getName(),

                                          s.getName(), "Entering");

    }

}

リスト8 LoggingAspect


アスペクトを作成したら、ajcでコンパイルして実行してみよう。先ほどと同じようにログが出力される。

> ajc *.java
> java Tester
2004/11/03 22:48:37 Tester main
情報 : Entering
2004/11/03 22:48:37 Messenger printMessage
情報 : Entering
AspectJ

実行結果(AspectJを使った場合)

 簡単にコードの補足をしておこう。8行目のポイントカット定義では、すべてのパッケージに属する全クラスのメソッド実行をジョインポイントに指定している。within()は引数に指定したクラスの全ジョインポイントを表すポイントカットキーワードであり、ここではLoggingAspectを指定して「!」オペレータを前に付けることで「自分自身以外」ということを表している。

  また11行目のthisJoinPointStaticPartは対象となるジョインポイントの静的情報を表したクラスであり、org.aspectj.langパッケージに含まれている。getSignature()メソッドで、そのジョインポイントのシグネチャ(修飾子、クラス名、メソッド名など)を取得することができる。

 このように「ロギング」という横断的関心事を既存のコードから分離することに成功しているのが理解してもらえただろうか。ここでは分かりやすい例として「ロギング」にAOPを適用する例を示したが、AOPは何もロギングのためだけにあるわけではない。前回の記事でも書いたが、リソースやスレッドなどのプール/キャッシング機能、永続化、権限によるアクセスコントロールなどもAOPで分離できる代表的な「横断的関心事」である。また、それ以外にもDbCやDesign PatternをAspectJを使って実装する例なども紹介されているので参考にしてほしい。

eclipse用AJDTプラグインのインストール

 それでは最後にeclipseを使った開発でAspectJを利用するためのAJDT(AspectJ Development Tools)を簡単に紹介しておこう。AJDTはeclipse用のAspectJプラグインであり、これを使うことでAspectJによる開発をより簡単に行えるようになる。ここではeclipse 3.0にAJDT 1.2を導入する手順を紹介しておくので、実際にインストールしていろいろな機能を試してほしい。

 eclipseを起動し、メニューバーより[Help] → [Software Updates] → [Find and Install...]をクリック。

ALT [Find and Install...]をクリック

 Search for new features to installにチェックを付け、[Next]をクリック。

 [New Remote Site...] をクリック。

 ダイアログが表示されるので適当な名前を付け(例えばAJDT)、URLに「http://download.eclipse.org/technology/ajdt/30/update」と入力して[OK]をクリック。

ALT URLにを入力する

 AJDTの表示の左側にある「+」マークをクリックすると、AspectJというサブツリーが表示されるのでチェックを付ける。[Next]をクリック。

 「Eclipse AspectJ Development Tools」のバージョン「1.2」の方にチェックを付けて[Next]をクリック。

 ライセンス条項を読み、「I accept the terms in the license agreements」にチェックを付け[Next]をクリック。

 [Finish]をクリック。

 デジタル署名に関する警告が出るが、そのまま[Install]をクリック。ネットワークインストールが始まる。

 インストールが終了したら、ワークベンチの再起動を促されるので[Yes]をクリック。

ALT ワークベンチの再起動を促されるので[Yes]をクリック

 再起動したら[Help] → [About Eclipse Platform]をクリックしてインストールの完了を確かめる。

ALT クリックしてインストールの完了を確かめる

 AJDTのロゴが表示されればインストールは成功。

 AJDTプラグインをインストールすると、次のように新しいプロジェクトの作成ダイアログには「AspectJ Project」が追加されている。


 今回の記事ではAOPの代表的な実装であるAspectJを紹介したが、実際にアスペクト指向プログラミングを試してみることで、概念的な部分だけではないアスペクト指向の理解が深まったのではないだろうか。次回はオープンソースのアプリケーションサーバー(EJBコンテナ)として有名なJBoss 4.0に採用されている「JBossAOP」によるアスペクト指向プログラミングの実践を紹介する。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ