Aspect を使用してカスタム アノテーションをすばやく実装する

私は最近何かを書きましたが、最初に例を挙げたほうがよいと思いました。

コードフロント

集中:

  1. アスペクト クラスの使用@Configuration@Aspect注釈
  2. アスペクト クラスのメイン メソッドは@Before, @After, @AfterReturning, @AfterThrowing, @Aroundetc を使用してカットを行います
  3. 使用するクラスを有効にするには、 @Resource メソッドを使用して注入する必要があります。
@Aspect
@Configuration  
public class PrintBeforeMethodAspect {  
    @Around("@annotation(PrintBeforeMethod)")  
    public void printBefore(ProceedingJoinPoint joinPoint) throws Throwable {  
        System.out.println("before method");  
        joinPoint.proceed();  
        System.out.println("after method");  
    }  
}
复制代码
@Resource  
Test testService;

@RequestMapping("/aspect/test")  
public Object aspectTest() {  
    testService.test();  
    return "执行完毕";  
}
复制代码

起因

最近、システムにマルチテナント機能を追加したい、アスペクトプログラミングを利用したい、@Aspectを利用したい、シェアしたい

@アスペクトの紹介

@Aspect アノテーションは、クラスをアスペクト クラスとしてマークするために使用されます。アスペクト クラスは、AOP (アスペクト指向プログラミング) の重要な部分です。

@Aspect アノテーションは、このクラスにアスペクト ロジックが含まれており、AOP 処理が必要であることを Spring フレームワークに伝えます。注釈付きクラスでは、アスペクト メソッドを定義して、他のメソッドのインターセプトと拡張を実装できます。

一般的に使用される切断方法は次のとおりです。

  1. @Before - 対象メソッドの実行前に実行されるメソッドは拡張前です。
  2. @After - 対象メソッドの実行後に実行されるメソッドは拡張後に属します。
  3. @AfterReturning - 対象のメソッドが正常に完了した後に実行されるメソッドは、戻り拡張です。
  4. @AfterThrowing - 例外強化に属する、対象メソッドで例外が発生した後に実行されるメソッド。
  5. @Around - ターゲット メソッドの前後にカスタム メソッドを実行して、ウィービングの強化を実現できます。ウィービング ポイントのメソッド シグネチャなどの情報を取得するために使用されるパラメーター JoinPoint が存在する場合があります。

@Aspect アノテーションを使用することで、AOP はビジネス層のメソッドごとに権限制御、パフォーマンス監視、トランザクション処理などの操作を実行できるようになり、システムの階層化と堅牢性が向上します。

完全な実装例

注釈とともに使用します

カスタム注釈

package com.kevinq.aspect;  
  
import java.lang.annotation.*;  
  
/**  
 * @author qww  
 * 2023/4/15 11:24 */
@Target({ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Inherited  
public @interface PrintBeforeMethod {  
  
  
}
复制代码

アスペクト、メインプログラム: ( @Configuration アノテーションがアスペクトクラスにあることに注意してください)

package com.kevinq.aspect;  
  
//import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.annotation.Around;  
import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Before;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.stereotype.Component;  
  
/**  
 * @author qww  
 * 2023/4/15 11:27 */
@Aspect  
@Configuration  
public class PrintBeforeMethodAspect {  
  
    @Around("@annotation(PrintBeforeMethod)")  
    public void printBefore(ProceedingJoinPoint joinPoint) throws Throwable {  
        System.out.println("before method");  
        joinPoint.proceed();  
        System.out.println("after method");  
    }  
  
}
复制代码

呼び出し方法:

メモを追加

@Service  
public class TestService implements Test{  
  
    @Override  
    @PrintBeforeMethod    
    public void test() {  
        System.out.println("执行test方法");  
    }  
}
复制代码

呼び出し方法

@Resource  
Test testService;

@RequestMapping("/aspect/test")  
public Object aspectTest() {  
    testService.test();  
    return "执行完毕";  
}
复制代码

@Configuration を使用して注入するため、@Resource を使用して呼び出しをインスタンス化する必要があり、new TestService() を使用することは無効であることに注意してください。

おすすめ

転載: juejin.im/post/7222152731946139707