Spring FrameworkにおけるAOPの基本概念と実践方法

java

AOPとは、「アスペクト指向プログラミング(Aspect Oriented Programming)」の略称です。
「アスペクト」を日本語に直訳すると「相」ですが、プログラミングの世界では「オブジェクト指向ではうまく分離できない横断的な機能」のことを指します。代表例としてはログ出力機能(各クラスの処理の開始・終了等のタイミングで割り込むような形で使われる)が挙げられます。
AOPをサポートするフレームワークでは、横断的な機能を別のプログラムとして切り出し、そのプログラムが特定のタイミングで呼び出されるように別途定義できるような機能が組み込まれています。

SpringFrameworkにも、AOPが機能の一つとして組み込まれています。
AOPを利用することで、横断的な機能を切り出して可読性を高めたり重複を排除したりすることができます。


以下は、SpringFrameworkでのAOPの書き方の一例です。
test関数の開始時と終了時に標準出力を割り込ませるサンプルコードです。

なお、便宜上、サンプルコードではRestControllerを併用していますが、AOPはRestControllerを併用する必要はありません。

【サンプルコード】

・SmpSpringBootApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SmpSpringBootApplication {

    // http://localhost:8080/test にアクセスした時に実行されるメソッド
    @RequestMapping("/test")
    public void test() {
        System.out.println("処理中");
    }

    // 実行するとプロセスが常駐される(アクセスを受け付けられるようになる)
    public static void main(String[] args) {
        SpringApplication.run(SmpSpringBootApplication.class, args);
    }
}

・MyFirstAspect.java

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyFirstAspect {
    @Before("execution(* com.example.demo.SmpSpringBootApplication.test(..))")
    public void before() {
        System.out.println("処理開始");
    }
    @After("execution(* com.example.demo.SmpSpringBootApplication.test(..))")
    public void after() {
        System.out.println("処理終了");
    }
}

【実行結果(コンソール)】

・SmpSpringBootApplication起動後、http://localhost:8080/testにアクセス

処理開始
処理中
処理終了

いかがでしたでしょうか。

SpringFrameworkのAOPについて簡単なサンプルコードが欲しかったので、簡単な解説を付けた上で記事に起こしました。
本日ではSpringFrameworkの情報は書籍やWeb上に十分に揃っているのですが、情報を付け加えたくなったらまた記事を起こしたいと思います。

コメント

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