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

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

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

#簡単な理解のための図
図にするとこんなイメージ

![AOP1.png](https://qiita-image-store.s3.amazonaws.com/0/124833/7a52d2bb-cc42-d60d-1e84-db709a1a6263.png)

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

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


#用語解説

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

![AOP2.png](https://qiita-image-store.s3.amazonaws.com/0/124833/c28e2824-d67b-fd81-2dda-063065d53e08.png)
図2.アドバイスとジョイン（エントリ）ポイントとポイントカット

#Spirngで使うときのpom.xml

下記を追加

```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..*.*(..))")`
みたいに使う
詳しくは[ここ](http://javatechnology.net/spring/execution-format/)

|	アドバイス側（制限）	|	説明	|
|	:--	|	:--	|
|	@target	|	指定のアノテーションを持つターゲットに制限	|
|	@args	|	指定のアノテーションを含む引数に制限	|
|	@within	|	指定のアノテーションをクラス宣言に含むターゲットに制限	|
|	@annotation	|	指定のアノテーションを含んでいるメソッドに制限	|


|	ポイントカット	|	説明	|
|	:--	|	:--	|
|	execution	|	実行	|
|	within	|	指定の型やパッケージで制限	|





#参考サイト
+ [SpringのDIとAOPの簡潔な説明](http://qiita.com/shuntaro_tamura/items/ba5a2e9b3ba305285edd)
+ [Spring AOPサンプルアプリでAOPを理解する (1/3)](http://www.atmarkit.co.jp/ait/articles/0512/03/news019.html)
+ [はじめてのSpring AOP](http://d.hatena.ne.jp/Kazuhira/20151012/1444647598)
+ [第3回 AOPでプログラムをシンプルにする 今必要な人のための速習 Spring Framework ](http://itpro.nikkeibp.co.jp/article/COLUMN/20070725/278220/)
+ [Aspectjの@Before、@Afterを使ってメソッド前後にログ出力を入れる](http://javatechnology.net/spring/aspectj-before-after/)
+ [アノテーションを使用してAOPをする](http://qiita.com/xaatw0/items/5876afa418d4b6467e4e)
+ [11. Aspect Oriented Programming with Spring](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#overview-aop-instrumentation)
+ [番外編　Spring AOPによるロギングの実装](http://www.oki-osk.jp/esc/spring/spring04.html)
+ [Spring AOP ぺーぺーSEのブログ](http://tanakakns.hatenablog.com/entry/20121210/1355137807)
+ [Struts 2入門（4）～インターセプターという仕組み～](https://codezine.jp/article/detail/3264)
+ [@AspectJ cheat sheet](https://blog.espenberntsen.net/2010/03/20/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](http://d.hatena.ne.jp/koichik/20040406)
+ [SpringのAOPフレームワークを使ってロギングをアスペクトとして実装する ](http://internetcom.jp/developer/20060530/26.html)
+ [SpringでAOP  闘うITエンジニアの覚え書き](http://www.magata.net/memo/index.php?Spring)
+ [Spring AOP Example – Advice](http://www.mkyong.com/spring/spring-aop-examples-advice/)
+ [[spring]7.2 @AspectJ supportAdd Star](http://d.hatena.ne.jp/minokuba/20110302/1299075764)
+ [6. Spring AOP:Springでのアスペクト指向プログラミング(Ver 1.2.7)](http://www.andore.com/money/trans/spring_ref_p7_ja.html)
+ [第５回：AOPとは何か Think IT](https://thinkit.co.jp/cert/compare/15/5/4.htm)
+ [executionの記述方法についてまとめました](http://javatechnology.net/spring/execution-format/)