私は最近何かを書きましたが、最初に例を挙げたほうがよいと思いました。
コードフロント
集中:
- アスペクト クラスの使用
@Configuration
、@Aspect
注釈 - アスペクト クラスのメイン メソッドは
@Before, @After, @AfterReturning, @AfterThrowing, @Around
etc を使用してカットを行います - 使用するクラスを有効にするには、 @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 フレームワークに伝えます。注釈付きクラスでは、アスペクト メソッドを定義して、他のメソッドのインターセプトと拡張を実装できます。
一般的に使用される切断方法は次のとおりです。
- @Before - 対象メソッドの実行前に実行されるメソッドは拡張前です。
- @After - 対象メソッドの実行後に実行されるメソッドは拡張後に属します。
- @AfterReturning - 対象のメソッドが正常に完了した後に実行されるメソッドは、戻り拡張です。
- @AfterThrowing - 例外強化に属する、対象メソッドで例外が発生した後に実行されるメソッド。
- @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() を使用することは無効であることに注意してください。