LoginSignup
184
183

More than 3 years have passed since last update.

ざっくりとSpringで使うAOPの解釈をする

Last updated at Posted at 2016-06-14

ログ出力で重宝しそうなAOPの概念を自分なりに解釈した

AOPとは

Aspect Oriented Programming(アスペクト指向プログラミング)の略。
オブジェクト指向みたいに、プログラミング手法の概念。

簡単な理解のための図

図にするとこんなイメージ

AOP1.png

共通処理を抜き出して、
プログラムのいろんなところで、横断的(Aspect)に呼び出す。
こうすることでログ出力みたいな、本来プログラムが持つべき本質的機能と予備的機能を分離できる

図1.AOPを適用する前のもの(左側)とAOP適用した場合(右側)

用語解説

用語 英単語 意味
アドバイス Advice 抽出した共通処理
ジョインポイント
(エントリポイント)
Join Point
(Entry Point)
アドバイスを入れる場所
(タイミング)
ポイントカット Pointcut アドバイスを適用する条件
アドバイサー Advisor アドバイスとポイントカットの両方を持つクラス
(アスペクトのモジュール化)
インターセプタ Interceptor 横取り・割り込み(インターセプト)して処理を行うもの。
アドバイスと同義(?)
クラスを作るときによく名前として使う模様
プロキシ Proxy フレームワークが生成したアドバイスを持つオブジェクト
ターゲット Target ジョインポイントを持つオブジェクト。
アドバイス(プロキシ)されるオブジェクト

AOP2.png
図2.アドバイスとジョイン(エントリ)ポイントとポイントカット

Spirngで使うときのpom.xml

下記を追加

pom.xml
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2</version>
        </dependency>
    </dependencies>

使いそうなコード(アノテーションなど)

まずアドバイスをもつクラスには@Aspectをつける

アドバイスつける側 説明
@Before メソッド実行前に呼び出す
@After メソッドの実行結果に関わらず、メソッド実行後に呼び出す
@Around メソッド実行の代わりに呼び出す(強い・便利)
@AfterReturning メソッドが正常終了した後に呼び出す(例外スロー時実行しない)
@AfterThrowing メソッド実行で例外がスローされた後に呼び出す

例えばexcutionのフォーマットは
execution(メソッド修飾子 メソッド戻り値 パッケージ名.クラス名.メソッド名(引数の型,引数の型) throws 例外)
なので、
@Before("execution(* com.example..*.*(..))")
みたいに使う
詳しくはここ

アドバイス側(制限) 説明
@target 指定のアノテーションを持つターゲットに制限
@args 指定のアノテーションを含む引数に制限
@within 指定のアノテーションをクラス宣言に含むターゲットに制限
@annotation 指定のアノテーションを含んでいるメソッドに制限
ポイントカット 説明
execution 実行
within 指定の型やパッケージで制限

参考サイト

184
183
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
184
183