Spring Boot カスタム アノテーションは AOP を実装します

1. カスタム注釈ルール

  1. アノテーションのタイプは @interface として定義されており、すべてのアノテーションは自動的に java.lang.Annotation インターフェースを継承し、他のクラスやインターフェースを継承することはできません。
  2. パラメーター メンバーは、パブリックまたはデフォルトのアクセス権でのみ変更できます。
  3. パラメーター メンバーは、byte、short、char、int、long、float、double、boolean の 8 つの基本データ型と、String、Enum、Class、注釈、およびこれらの型の配列などのデータ型のみを使用できます。
  4. クラスのメソッドおよびフィールドのアノテーション情報を取得するには、Java のリフレクション技術を通じて Annotation オブジェクトを取得する必要があります。これは、アノテーション オブジェクトを取得する他の方法がないためです。
  5. 注釈には定義済みのメンバーを持たないこともできますが、その場合、注釈は役に立ちません。

2. カスタム アノテーションを定義する場合の関連アノテーションの概要

@Documented アノテーション関数: 変更を指定するアノテーションは、javadoc などのツールによって文書化できます。これらのアノテーションはマークのみを担当し、メンバー値を持ちません。

@保持アノテーション関数: 変更されたアノテーションのライフサイクル、つまりどの段階まで保持されるかを示します。RetentionPolicyの値には以下の3種類があります。
SOURCE:ソースコードレベルで保持され、コンパイル後に破棄されます。CLASS: コンパイル レベルは保持され、コンパイルされたクラス ファイルに存在し、jvm の実行中に破棄されます。これはデフォルト値です。
RUNTIME: 実行レベルは予約されており、コンパイルされたクラス ファイル内に存在し、jvm の実行時に予約され、リフレクティブに呼び出すことができます。

@Target アノテーション関数: 変更されたアノテーションの使用範囲、つまり記述されたアノテーションが使用できる範囲を示します。ElementType 値には次のものが含まれます。

TYPE: クラス、インターフェイス、または列挙 FIELD: ドメイン (列挙定数を含む) METHOD: メソッド PARAMETER: パラメーター CONSTRUCTOR: コンストラクター メソッド
LOCAL_VARIABLE: ローカル変数 ANNOTATION_TYPE: 注釈タイプ PACKAGE: パッケージ

3. Spring の AOP を使用して、まず Maven 依存関係を追加します

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

4. まず、自己定義のアノテーションを作成します

@Documented
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    
    
}

5.AOPの設定

@Aspect//アスペクト
@Pointcut//アスペクトが必要な場所を定義
@annotation//実行されたメソッドに指定されたアノテーションがある場合に有効になります。
@後
@前
@周り

@Component
@Aspect
public class MyAnnotationAspect {
    
    
    @Pointcut("@annotation(com.example.demo.annotation.MyAnnotation)")
    private void myAnnotation() {
    
    
    }

    /**
     * 环绕通知
     */
    @Around("myAnnotation()")
    public void advice(ProceedingJoinPoint joinPoint) throws Throwable {
    
    
        System.out.println("around begin...");
        //执行到这里走原来的方法
        joinPoint.proceed();
        System.out.println("around after....");
    }

    @Before("myAnnotation()")
    public void record(JoinPoint joinPoint) {
    
    
        System.out.println("Before");
    }

    @After("myAnnotation()")
    public void after() {
    
    
        System.out.println("After");
    }
}

ProceedingJoinPoint と JoinPoint の説明
AspectJ は org.aspectj.lang.JoinPoint インターフェイスを使用して、ターゲット クラスの接続ポイント オブジェクトを表します。サラウンド拡張の場合は、 org.aspectj.lang.ProceedingJoinPoint を使用して接続ポイント オブジェクトを表します。このクラスはサブクラスです-JoinPoint のインターフェイス。どの拡張メソッドでも、最初の入力パラメーターを JoinPoint として宣言することで、ジョイン ポイント コンテキストの情報にアクセスできます。まず、これら 2 つのインターフェイスの主なメソッドを見てみましょう。

1.JoinPoint
java.lang.Object[] getArgs(): ジョインポイントメソッド実行時の入力パラメータリストの取得;
Signature getSignature(): ジョインポイントのメソッドシグネチャオブジェクトの取得;
java.lang.Object getTarget() : 結合ポイントを取得します 結合ポイントが配置されているターゲット
オブジェクトを取得します; java.lang.Object getThis(): プロキシ オブジェクト自体を取得します;
2.ProceedingJoinPoint
ProceedingJoinPoint は、結合ポイント メソッドを実行するための 2 つの新しいメソッドを追加する JoinPoint サブインターフェイスを継承します。 :
java.lang.Object continue( ) throws java.lang.Throwable: リフレクションにより対象オブジェクトの接続点でメソッドを実行;
java.lang.Object continue(java.lang.Object[] args) throws java.lang .Throwable: リフレクションを通じてターゲット オブジェクトの接続ポイントを実行します。 上記と同じ方法ですが、新しい入力パラメータを使用して元の入力パラメータを置き換えます。

6.コントローラーテスト

@RestController
public class MyAnnotationController {
    
    

    @MyAnnotation
    @RequestMapping("/aa")
    public void testAnnotation(){
    
    
        System.out.println("我正在测试自定义注解。。。");
    }
}

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_45163291/article/details/128657981