ログ出力で重宝しそうなAOPの概念を自分なりに解釈した
#AOPとは
Aspect Oriented Programming(アスペクト指向プログラミング)の略。
オブジェクト指向みたいに、プログラミング手法の概念。
#簡単な理解のための図
図にするとこんなイメージ
共通処理を抜き出して、
プログラムのいろんなところで、**横断的(Aspect)**に呼び出す。
こうすることでログ出力みたいな、本来プログラムが持つべき本質的機能と予備的機能を分離できる
図1.AOPを適用する前のもの(左側)とAOP適用した場合(右側)
#用語解説
用語 | 英単語 | 意味 |
---|---|---|
アドバイス | Advice | 抽出した共通処理 |
ジョインポイント (エントリポイント) |
Join Point (Entry Point) |
アドバイスを入れる場所 (タイミング) |
ポイントカット | Pointcut | アドバイスを適用する条件 |
アドバイサー | Advisor | アドバイスとポイントカットの両方を持つクラス (アスペクトのモジュール化) |
インターセプタ | Interceptor | 横取り・割り込み(インターセプト)して処理を行うもの。 アドバイスと同義(?) クラスを作るときによく名前として使う模様 |
プロキシ | Proxy | フレームワークが生成したアドバイスを持つオブジェクト |
ターゲット | Target | ジョインポイントを持つオブジェクト。 アドバイス(プロキシ)されるオブジェクト |
図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 | 指定の型やパッケージで制限 |
#参考サイト
- SpringのDIとAOPの簡潔な説明
- Spring AOPサンプルアプリでAOPを理解する (1/3)
- はじめてのSpring AOP
- 第3回 AOPでプログラムをシンプルにする 今必要な人のための速習 Spring Framework
- Aspectjの@Before、@Afterを使ってメソッド前後にログ出力を入れる
- アノテーションを使用してAOPをする
- 11. Aspect Oriented Programming with Spring
- 番外編 Spring AOPによるロギングの実装
- Spring AOP ぺーぺーSEのブログ
- Struts 2入門(4)~インターセプターという仕組み~
- @AspectJ cheat sheet
- [Spring 3.0 : そしてAOP 18:12] (http://d.hatena.ne.jp/ayakobaba/20110211/1297415568)
- [Java][Spring][AOP] Spring Framework 入門記 AOPその8 Throws Advice
- SpringのAOPフレームワークを使ってロギングをアスペクトとして実装する
- SpringでAOP 闘うITエンジニアの覚え書き
- Spring AOP Example – Advice
- [spring]7.2 @AspectJ supportAdd Star
- 6. Spring AOP:Springでのアスペクト指向プログラミング(Ver 1.2.7)
- 第5回:AOPとは何か Think IT
- executionの記述方法についてまとめました