【Java】Spring BootでSpring AOPを触ってみた

Programming
スポンサーリンク

こんにちは、しょうぞうです。

今回は、ログ出力の際に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を簡単にまとめてみましたが、まだまだ奥が深そうです。

アスペクト指向プログラミングという考え方は他の部分でも使えそうなので、忘れずに今後に生かしていきたいと思います。

以上!

コメント

タイトルとURLをコピーしました