Spring BootのAOP(アスペクト指向プログラミング)のサンプルです。
AOPは、Aspect Oriented Programmingの略です。(確認環境:Spring Boot 2.5,JDK 11)
目次
サンプル | AOPサンプルの概要 / pom.xmlの設定 |
1.設定ファイル(AOPのファイル) / アドバイス/ PointCut式 / 指定子 | |
2.コントローラのファイル(MainController.java) |
AOPサンプルの概要
処理の流れ
ブラウザでURLを指定してコントローラ(MainController.java)にアクセスします。
コントローラの処理が終了すると設定ファイル(TestLog.java)にセットしたAOPによりログが出力されます。
pom.xmlの設定
必要なライブラリです。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.設定ファイル(AOPのファイル)
AOPを行うファイルです。(TestLog.java)
package com.example.demo;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TestLog {
@After("within(com.example.demo.MainController)")
public void write1() {
System.out.println("ログテスト後");
}
}
6行目は、@Aspectアノテーションです。このクラスはAOPとして動作するようになります。
10行目は、処理を実行する「タイミング」と「場所」を指定しています。
12行目は、連携先のメソッドが実行された後にコンソールに文字列を表示します。
アドバイス
アドバイスとは実行される処理です。(上記コードの11~13行目)
以下はアドバイスのアノテーションです。
アノテーション | 説明 |
---|---|
@After | 処理の後 |
@Before | 処理の前 |
@Around | 処理の前と後 |
@AfterReturning | 正常終了の後 |
@AfterThrowing | 例外終了の後 |
PointCut式
処理を実行する場所をPointCut式といいます。
上記コードの10行目のwithin以降はPointCut式です。com.example.demoパッケージのMainControllerクラスのwithin(クラスの中のメソッド)を指します。withinは、指定子です。
指定子
指定子 | 説明 |
---|---|
execution | メソッドを指定。 |
within | クラスを指定。クラス内のメソッドが対象になる。 |
@annotation | アノテーションを指定。メソッドが対象になる。 |
@within | アノテーションを指定。クラス内のメソッドが対象になる。 |
ポイントカット式で使用する記号と論理演算子
記号 | 説明 |
---|---|
* | 任意の文字にマッチする。 |
.. | 任意の0文字以上にマッチする。 |
&& | 論理演算子のAND |
|| | 論理演算子のOR |
! | 論理演算子の否定 |
別の指定
package com.example.demo;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TestLog {
@After("execution(String *..*MainController.input*(..))")
public void write1() {
System.out.println("ログテスト後");
}
}
10行目は、戻り値を指定し、パッケージ名は指定せず、メソッド名の途中まで指定したパターンです。
参考:
SpringのAOPについて
Spring AOP ポイントカット指定子の書き方について
2.コントローラのファイル(MainController.java)
コントローラのファイルです。
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MainController {
@GetMapping("/test1")
public String input1() {
return "test1";
}
@GetMapping("/test2")
public String input2(){
return "test2";
}
}
ブラウザで以下のURLにアクセスするごとに、コンソールにAOPのファイルで指定した文字列が表示されます。
http://localhost:8080/test1
http://localhost:8080/test2
以下は、文字列がコンソールに表示された例です。
関連の記事
SpringBoot JPAでMySQLにselectするサンプル
SpringBoot DI(依存性の注入)のサンプル