10.3. JBoss AOP でアスペクトを適応

アスペクトを適用するには、アスペクトコードの実行時を定義します。実行のポイントはポイントカットと呼ばれます。ポイントカットは正規表現と似ています。正規表現は文字列とマッチさせますが、ポイントカット表現はアプリケーション内のイベントやポイント とマッチさせます。例えば、有効なポイントカット定義は「JDBC メソッド executeQuery() への呼び出しに対し、SQL 構文を検証するアスペクトを呼び出す」のようになります。
フィールドアクセスやメソッドコール、コンストラクタコールなどがエントリポイントとなります。 スローされた例外などがイベントとなります。 AOP 実装によっては、 ポイントカットの指定にクエリに似た言語を使用するものもあります。 その他の AOP 実装はタグを使用します。 JBoss AOP は両方を使用します。
次のリストは JBoss AOP における Metrics 例のポイントカットの定義方法を示しています。
1 <interceptor name="SimpleInterceptor" class="com.mc.Metrics"/>
2 <bind pointcut="execution (public void com.mc.BankAccountDAO->withdraw(double amount))" >
3     <interceptor-ref name="SimpleInterceptor" />
4 </bind>
5 <bind pointcut="execution (* com.mc.billing.->(..))">
6     <interceptor-ref name="com.mc.Metrics" />
7 </bind>
1 行目は interceptor クラスへの インターセプター名のマッピングを定義しています。2-4 行目は、特定のBankAccountDAO.withdraw() メソッドに metrics アスペクトを適用するポイントカットを定義します。5-7 行目は com.mc.billing パッケージにおける全クラスの全メソッドへ metrics アスペクトを適用する一般的なポイントカットを定義します。XML を希望しない場合は、オプションのアノテーションマッピングもあります。詳細は JBoss AOP の参照文書をご覧ください。
JBoss AOP には Java アプリケーションの様々なポイントやイベントを定義するために使用できるポイントカット表現のセットが多くあります。 ポイントを定義した後にアスペクトを適用することができます。 アプリケーション内の特定の Java クラスにアスペクトを適用することができますが、 複雑な複合的なポイントカットを使用し、 1 つの表現内に複数のクラスを指定することもできます。
この例の通り、 AOP では横断的動作を 1 つのオブジェクトにまとめ、 ビジネスロジックに関係ない機能でコードを複雑化することなく簡単に適応することができます。 共通の横断的関心事は 1 つの場所で維持拡張できます。
BankAccountDAO クラス内のコードはプロファイルされた事を認識しません。 プロファイリングはアスペクト指向プログラマーが直交した関心事 (orthogonal concern) として考えるものの一部です。 本章の始めにあるオブジェクト指向プログラミングのコードスニペットでは、 プロファイリングがアプリケーションコードの一部となっています。 AOP ではこのコードを削除することが可能です。 近年のミドルウェアは透明性を約束していますが、 AOP も確実に透明性を提供します。
直交した動作は開発後に追加することもできます。 オブジェクト指向コードでは、 監視とプロファイリングは開発時に追加されなければなりません。 AOP では、 開発者や管理者がコードに触れることなく必要に応じて簡単に監視やメトリックスを追加することができます。 これは目立った機能ではありませんが、 この分離により、 横断するコードの上下にアスペクトを階層化することができるため、 AOP の重要機能の一部になります。 階層化により、 必要な時に機能を追加削除できます。 例えば、 ベンチマークを実行する時のみメトリクスを有効にし、 実稼働時に削除するとします。 AOP では、 コードを編集、 再コンパイル、 再パッケージすることなく、 これを実行することができます。