10.2. JBoss AOP でアスペクトを作成

簡単に説明すると、すべての AOP フレームワークは、横断的関心事を実装する方法とプログラムコンストラクト (プログラミング言語またはタグのセット) の 2 つを定義し、コードスニペットの適用方法を指定します。JBoss AOP、横断的関心事、ユーザーがどのように JBoss Enterprise Application Platform でメトリクスアスペクトを実装できるか見てみましょう。
独自の Java クラスにメトリクス機能をカプセル化することが JBoss AOP にメトリックスアスペクトを作成する最初のステップになります。 以下のコードは、 最初のコード例の BankAccountDAO.withdraw() メソッドにある try/finally ブロックを JBoss AOP インターセプタークラスの実装である Metrics に抽出します。
次のリストは JBoss AOP インターセプターへのメトリクス実装を表しています。
01. public class Metrics implements org.jboss.aop.advice.Interceptor
02. {
03.   public Object invoke(Invocation invocation) throws Throwable
04.   {
05.     long startTime = System.currentTimeMillis();
06.     try
07.     {
08.       return invocation.invokeNext();
09.     }
10.     finally
11.     {
12.       long endTime = System.currentTimeMillis() - startTime;
13.       java.lang.reflect.Method m = ((MethodInvocation)invocation).method;
14.       System.out.println("method " + m.toString() + " time: " + endTime + "ms");
15.     }
16.   }
17. }
JBoss AOP では、 Metrics クラスが withdraw()をラップします。 呼び出しコードが withdraw() を呼び出すと、 AOP フレームワークがメソッドコールをパーツに分解し、 パーツを呼び出しオブジェクトにカプセル化します。 その後、 呼び出しコードと実際のメソッドボディーの間に存在するすべてのアスペクトをフレームワークが呼び出します。
AOP フレームワークによるメソッドコールの分解が終了すると、 3 行目でMetricsの呼び出しメソッドを呼び出します。 8 行目は実際のメソッドをラップし、実際のメソッドへ委譲します。try/finally ブロックを使用してタイミングを実行します。 13 行目は Invocation オブジェクトからメソッドコールのコンテキスト情報を取得します。 14 行目はメソッド名と算出されたメトリクスを表示します。
独自のオブジェクト内に Metrics コードが存在することにより、後で追加の測定を簡単に拡張し取得することができます。アスペクトにカプセル化されたメトリクスの適用方法を見てみましょう。