Java
spring
AOP
アスペクト指向
More than 1 year has passed since last update.

AOPとはアスペクト指向プログラミング(Aspect Oriented Programming)の略で、複数のクラスに点在する横断的な関心事を中心に設計や実装を行うプログラミング手法のことです。

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発に載っているAOPの説明について、重要だと思う箇所をまとめます。(後で見返せるように書籍のページ数を記載しています)

AOPの用語

AOPの代表的な用語について(P.59)

  • Aspect
    AOPの単位となる横断的な関心事を示すモジュールそのもののこと。
    例としては、「ログを出力する」「例外をハンドリングする」「トランザクションを管理する」などがAspectと呼ばれる。

  • Join Point
    Aspectを実行するポイント(メソッド実行時や例外スロー時など)のこと。
    Spring AOPでのJoin Pointはメソッドの実行時です。

  • Advice
    特定のJoin Pointで実行されるコードのこと。
    横断的な関心事を実装する箇所。
    Around、Before、Afterなど複数の種類が存在する。

  • Pointcut
    実行対象のJoin Pointを選択する表現(式)のこと。
    Join Pointのグループと捉えられる。
    Spring AOPでは、Bean定義やアノテーションでPointcutを定義する。
    例えば、○○Controllerという名前のクラスでのみ実行とか、findで始まるメソッド名の場合のみ実行するなどを決めるものです。
    ワイルドカード指定が出来ます。

  • Weaving
    アプリケーションコードの適切なポイントにAspectを入れ込む処理のこと。
    Spring AOPでは実行時にWeavingを行う。

  • Target
    AOP処理によって処理フローが変更されたオブジェクトのこと。
    Advicedオブジェクトと呼ばれる場合もある。

Springで利用可能なAdvice

Spring AOPでは以下の5つのAdviceを利用できる。(P.60)

Advice 概要
Before Join Pointの前に実行されるAdvice。
After Returning Join Pointが正常終了した後に実行されるAdvice。例外がスローされた場合は実行されない。
After Throwing Join Pointで例外がスローされた後に実行されるAdvice。正常終了した場合は実行されない。
After Join Pointの後で実行されるAdvice。正常終了、例外に関わらず実行される。
Around Join Pointの前後で実行されるAdvice。

Pointcut式

以下のソースコードの様にexecutionなんたらと書いて、実行対象のJoin Pointを選択する記述方法。(P.69)

@Aspect
@Component
public class MethodStartLogAspect {

    // *Controllerというクラス名の任意のメソッドで実行するAdviceの例
    @Before("execution(* *..*Controller.*(..))")
    public void startLog(JoinPoint jp) {
        System.out.println("メソッド開始:" + jp.getSignature());
    }
}

メソッド名で対象のJoin Pointを選択する

メソッド名のパターンを指定して対象のJoin Pointを表現するときには、execution指示子を使用する。

execution(* com.example.domain.*Service.find*(..))

/*
上記例では、

戻り値が*
パッケージ名がcom.example.domain
型、クラス名が*Service
メソッド名がfind*
引数が任意の0以上の引数

を表している。
*/

Pointcut式で利用可能なワイルドカード

Pointcut式で利用可能なワイルドカードは以下です。(P.70)

ワイルドカード 説明
* 基本的には任意の文字列を表すが、パッケージを表現する場合は、任意のパッケージ1階層を表す。メソッドの引数を表現する場合は、1つの数の引数を表す。
.. パッケージを表現する場合は、任意の(0以上の)パッケージを表す。メソッドの引数を表現する場合は、任意の(0以上の)数の引数を表す。
+ クラス名の後に指定することにより、そのクラスとそのサブクラス/実装クラスすべてを表す。

参考元

書籍

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発