SpringBoot AOPのサンプル

Spring BootのAOP(アスペクト指向プログラミング)のサンプルです。
AOPは、Aspect Oriented Programmingの略です。

確認環境
・Windows10
・JDK 11
・Spring Boot 2.5

目次

サンプル 環境
  pom.xmlの設定
  1.AOPのファイル(TestLog.java)
  2.コントローラのファイル(MainController.java)

環境

今回作成/修正するファイルは以下の赤枠の部分です。

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のファイル(TestLog.java)

AOPを行うファイルです。

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行目は、連携先のメソッドが実行された後にコンソールに文字列を表示します。

Advice

「タイミング」は、Adviceと呼ばれます。

説明(Advice) 内容
@After 処理の後
@Before 処理の前
@Around 処理の前と後
@AfterReturning 正常終了の後
@AfterThrowing 例外終了の後

PointCut式

処理を実行する「場所」PointCut式といいます。

10行目のPointCut式は、com.example.demoパッケージのMainControllerクラスのwithin(クラスの中のメソッド)を指します。withinは、指定子です。

別の指定

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 hello worldを表示するサンプル
SpringBoot フォームの値を別画面に渡す
SpringBoot JPAでMySQLにselectするサンプル
SpringBoot DI(依存性の注入)のサンプル
SpringBoot JSONの送信と受信のサンプル

△上に戻る