SpringAOPの@Around、@ AfterReturningの使用は、問題解決に入ることができません

序文

この記事では、主に、作業中のいくつかの典型的なAOPの実践事例と、一般的な問題(切り取りできない、Ctrl +左ボタンで切り取り方法にジャンプできない)などを挙げています。

この記事ではAOPの実装原理については説明していませんが、BaiduYisouにはあります。

AOPを使用する背景と利点

たとえば、モジュールAは会社のコアモジュールであり、このコードを許可なく簡単に改ざんすることはできません。

ただし、新しい要件があり、会社のコアモジュールのメソッドを拡張する必要があります(コアメソッドを実行する前にカスタムログを印刷したり、コアメソッドの入力パラメーターと戻り値を変更したりするなど)

このようにして、コアモジュールのソースコードを変更することなく、ソースコードのメソッドを拡張し、元のメソッドの一部の機能を拡張できます。

これにより、ソースコードが破損しないようにするだけでなく、ソースコードの既存の機能を拡張することもできます。

1つ、いくつかの姿勢

1、@AfterReturning和@ Before

@AfterReturningはpostメソッドであり、ターゲットメソッドの実行後に実行されます。@ Beforeはpreメソッドであり、ターゲットメソッドが実行される前に実行されます。

これらは通常、JoinPointで使用されます(ProceedingJoinPointでは使用されません。エラーが報告されます)。例を見てください:

カット方法:

@Service
public class OriFuncImpl implements OriFunc{
    
    

    @Override
    public String ori(String str){
    
    
        System.out.println("执行了原方法");
        return str;
    }
}

@AfterReturningと@Beforeを使用します。

@Aspect
@Component
public class AopFunc {
    
    
    @Pointcut("execution(* com.daji.aop_test.OriFuncImpl.ori(..))")
    public void test() {
    
    
    }

    @Before("test()")
    public void before(JoinPoint joinPoint) {
    
    
        Object[] args = joinPoint.getArgs();    //获取方法入参
        System.out.println("原方法的入参是:"+args[0]);
        System.out.println("原方法执行前会先执行我!!");
    }


    @AfterReturning("test()")
    public void after(JoinPoint joinPoint) {
    
    
        Object[] args = joinPoint.getArgs();    //获取方法入参
        System.out.println("原方法执行后会执行我!!");
    }

}

2、@Around

@Aroundはサラウンド通知であり、入力パラメーターだけでなく、元のメソッドの実行と戻り値も制御できます。

多くの場合、ProceedingJoinPointで使用されます。例を見てください:

カット方法:

@Service
public class OriFuncImpl implements OriFunc{
    
    

    @Override
    public String ori(String str){
    
    
        System.out.println("执行了原方法");
        return str;
    }
}

@Aroundを使用します:

@Aspect
@Component
public class AopFunc {
    
    
    @Pointcut("execution(* com.daji.aop_test.OriFuncImpl.ori(..))")
    public void modifyReturn() {
    
    
    }

    @Around("modifyReturn()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    
    
        Object[] args = joinPoint.getArgs();
        Object result = joinPoint.proceed(args);
        return result;
    }

}

3. @Aroundは、戻り値を改ざんしたり、入力パラメーターを改ざんしたりする可能性があります

ProceedingJoinPointの協力が必要です

次の図に示すように、@ Aroundによって変更されたメソッドは、Objectを使用して戻り値に変更し、元のメソッドの実行結果を返す必要があることに注意してください。

ここに画像の説明を挿入
入力パラメーターの改ざんと同じように、下の図のargs配列を改ざんし、それをプロシージャに渡して、入力パラメーターの改ざんを完了するだけです。以下に示すように:

ここに画像の説明を挿入

したがって、この@Aroundは、特にProceedingJoinPointで使用する場合に、より用途が広くなります。AOPができることはもっとたくさんあります。

JoinPointとProceedingJoinPointの間の関係を拡張します。

  • ProceedingJoinPointは@Aroundでのみ使用できます

  • JoinPointは、@ Beforeおよび@AfterReturningに使用できる入力パラメーター(getArgs())を取得することもできます。

  • ProceedingjoinpointはJoinPointを継承します。proceedメソッドはJoinPointに基づいて公開されます。それらの関係は次のとおりです。

ここに画像の説明を挿入

4. @Aroundがproceed()を実行しない場合、元のメソッドは実行されません

第二に、AOPの一般的な問題とバグの使用

1.入場できません

次の注釈を確認してください。

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.4</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.2</version>
</dependency>

チェックした後、アスペクトクラスをチェックして、次のアノテーションのいずれかがあるかどうかを確認します。

ここに画像の説明を挿入

2.ctrl+マウスの左ボタンで自動的にcutメソッドにジャンプすることはできません。

通常の状況は、図に示すとおりです。

ここに画像の説明を挿入
上記の問題が発生した場合は、次のプラグインがインストールされているかどうかを確認してください。

ここに画像の説明を挿入
アイデアコミュニティバージョンの場合、デフォルトはそうではありません。自分でダウンロードするか、公式バージョンに変更してください。

おすすめ

転載: blog.csdn.net/weixin_44757863/article/details/123231410