技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

SpringFrameworkのAOPとは

AOPとは、「アスペクト指向プログラミング(Aspect Oriented Programming)」の略称です。
アスペクト」を日本語に直訳すると「相」ですが、プログラミングの世界では「オブジェクト指向ではうまく分離できない横断的な機能」のことを指します。代表例としてはログ出力機能(各クラスの処理の開始・終了等のタイミングで割り込むような形で使われる)が挙げられます。
AOPをサポートするフレームワークでは、横断的な機能を別のプログラムとして切り出し、そのプログラムが特定のタイミングで呼び出されるように別途定義できるような機能が組み込まれています。
 
SpringFrameworkにも、AOPが機能の一つとして組み込まれています。
 
---------------------
 
文章だけだとイメージが難しいと思うので、サンプルコードを付けます。
test関数の開始時と終了時に標準出力を割り込ませるサンプルコードです。
(サンプルコードで紹介した以外にもAOPの書き方は色々あるので、詳しくは書籍やWebで調べてみて下さい)
 
なお、便宜上、サンプルコードではRestControllerを併用していますが、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 {

    @RequestMapping("/test") // http://localhost:8080/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にアクセス
処理開始
処理中
処理終了