こんにちは、しょうぞうです。
今回は、ログ出力の際にSpring AOPをSpring Bootで使用したので、その内容をまとめておきたいと思い記事にしました。
Spring AOPとは
Spring AOPとは、Springを使用したアスペクト指向プログラミングを実現するものです。
アスペクト指向プログラミング(AOP)とは、オブジェクト指向ではうまく分離できない特徴(クラス間を横断 (cross-cutting) するような機能)を「アスペクト」とみなし、アスペクト記述言語をもちいて分離して記述することでプログラムに柔軟性をもたせようとする試みである。
Wiki参照
代表的な例として、Javaが挙げられていましたが、この考え方はまだ広まっていないそうです。
アスペクトという単位で、複数のタイプやオブジェクトにまたがるトランザクション管理などの懸念事項のモジュール化を可能にするものです。
今回の場合だと、ログ出力を共通処理としてコントローラーやサービスの前後に挟む感じです。
AOPで使われる単語一覧
単語 | 意味 |
---|---|
Aspect |
複数のタイプやオブジェクトにまたがるトランザクション管理をモジュール化するもの |
Join Point |
メソッドの実行や例外の処理など、プログラム実行中のポイントのこと |
Advise | 特定のジョインポイントでアスペクトによって実行されるアクション(共通処理) |
Pointcut | Adviseをいつ実行するかを制御するもの・ポイントカット式で制御する |
他にも単語の定義がドキュメントに書かれているのですが、今回使用したものでは上記の内容でわかるので省略します。
詳しくは、Spring AOPドキュメント参照
Spring AOPの導入・使用
Spring AOPをSpring Bootで使用する場合は、pom.xmlに依存性を注入するだけでOKです。
以下のコードを追加するだけです。
サンプルコードは以下のような感じで
MethodAOP.java
MainController.java
MethodAOP.javaでは@Aspectと@Componentをつけることで共通処理を定義しています。
メソッドにアドバイス(@After)とポイントカット式(execution〜)を追加することでそのメソッドがどの場所でいつ実行するかを制御することができます。
今回の場合は、controllerパッケージ配下にある全てのメソッドが実行された後(After)にログを出力するという内容になっています。
他にアドバイスの種類には、
@Before
@Around
@AfterThrowing
@AfterReturning
などがあります。
引数にJointPointクラスを取ることで、getSignature()を使って現在のメソッドのシグネチャ(説明)などを取得することができます。
他にも
getArgs()
getTarget()
getTarget()
などがあります。
詳しくはJavadocを参照してくださいとのことです。
実際に、http://localhost:8080/test1にアクセスすると、以下の画像のようにログが出力されます!
まとめ
Spring AOPを簡単にまとめてみましたが、まだまだ奥が深そうです。
アスペクト指向プログラミングという考え方は他の部分でも使えそうなので、忘れずに今後に生かしていきたいと思います。
以上!
コメント