SpringBoot AOPのサンプル

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(依存性の注入)のサンプル

△上に戻る