ホームページ  >  記事  >  Java  >  Spring AOP アノテーションの詳細な説明

Spring AOP アノテーションの詳細な説明

Guanhui
Guanhui転載
2020-06-28 17:59:443234ブラウズ

Spring AOP アノテーションの詳細な説明

アスペクト: アスペクト

アスペクト = ポイントカット通知。古い Spring バージョンでは通常 XML 構成が使用されますが、現在ではクラスには通常 @Aspect アノテーションが付けられます。アスペクトは、指定された結合ポイントに横断的なロジック (アドバイス) を織り込む責任があります。

ターゲット オブジェクト: Target

強化されるオブジェクト。

結合ポイント: JoinPoint

インターセプトできるプログラム実行ポイントは、Spring のクラス内のメソッドです。

エントリ ポイント: PointCut

インターセプトする必要があるメソッドは、特に横断的なロジックを実装するメソッドです。ポイントカット ルールは、AspectJ ポイントカット式言語を通じて Spring で記述されます。

エントリー ポイントと接続ポイントの違い: 接続ポイントはすべて「カット」できるポイントであり、エントリー ポイントは本当にカットしたいポイントです。

アドバイス: アドバイス

「前後」、「前」、「後」などのさまざまな種類のアドバイスを含む、エントリ ポイントの横断的なロジック。

アドバイスのアクション ポイントの名前は次のとおりです:

  • before: エントリ ポイントの前に実行されます

  • after: after エントリ ポイントの後に実行

  • #around: エントリ ポイントでメソッドをインターセプト、カスタマイズの前後、より柔軟な

ありいくつかの例外処理通知もあります。ここでは 1 つずつ例を示しません。

#Weaving

アスペクトとターゲット オブジェクトを接続してプロキシを作成するプロセスオブジェクト。春には動的プロキシが使用されます。ターゲット オブジェクトにインターフェイスがある場合は jdk 動的プロキシを使用し、それ以外の場合は cglib 動的プロキシを使用します。

これまで多くの概念を述べてきましたが、コードの実装を見ると、読者の理解がさらに深まるかもしれません。ここでは、アノテーションによってメソッドを強化する簡単な AOP デモを示します。

最初はアスペクト クラスです:

package com.example.demo.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author Fcb
 * @date 2020/6/20
 * @description 切面类=切入点+通知
 */
@Aspect
@Component
public class LogAspect {

  //这个方法定义了切入点
  @Pointcut("@annotation(com.example.demo.aop.anno.MyLog)")
  public void pointCut() {}

  //这个方法定义了具体的通知
  @After("pointCut()")
  public void recordRequestParam(JoinPoint joinPoint) {
    for (Object s : joinPoint.getArgs()) {
      //打印所有参数,实际中就是记录日志了
      System.out.println("after advice : " + s);
    }
  }

  //这个方法定义了具体的通知
  @Before("pointCut()")
  public void startRecord(JoinPoint joinPoint) {
    for (Object s : joinPoint.getArgs()) {
      //打印所有参数
      System.out.println("before advice : " + s);
    }
  }

  //这个方法定义了具体的通知
  @Around("pointCut()")
  public Object aroundRecord(ProceedingJoinPoint pjp) throws Throwable {
    for (Object s : pjp.getArgs()) {
      //打印所有参数
      System.out.println("around advice : " + s);
    }
    return pjp.proceed();
  }
}

アノテーション:

package com.example.demo.aop.anno;
import java.lang.annotation.*;
/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyLog {
}

ターゲット クラス:

package com.example.demo.aop.target;

import com.example.demo.aop.anno.MyLog;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@RestController
public class MockController {

  @RequestMapping("/hello")
  @MyLog
  public String helloAop(@RequestParam String key) {
    System.out.println("do something...");
    return "hello world";
  }

}

最後にテスト クラス:

package com.example.demo.aop.target;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@SpringBootTest
class MockControllerTest {
  @Autowired
  MockController mockController;

  @Test
  void helloAop() {
    mockController.helloAop("aop");
  }
}

コンソールの結果:

周りのアドバイス : aop

前アドバイス : aop
何かをしてください...
後アドバイス : aop

推奨チュートリアル: "

JavaTutorial>>

以上がSpring AOP アノテーションの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。