(デモが付属しています)にAOP機構springboot2.xを要約します

メッセージ:それはAOP中学校の学校の始まり、先生はよくないですが、私は、その時だけAOPを知り、学び、鉛、今より明確に理解を持っていませんでした

AOPは、現在までに、かむことは困難AOP任意のコースを、ロールのルーツを理解していないが、通常ので、ここにまとめたインタビューを、使用しないでください。

以下は、スタートをまとめたものです。

注:私はspringboot2.1 + maven3.6を使用しています、自分自身の基盤環境をセットアップしてください。

githubのプロジェクト住所:https://github.com/zgq7/devloper-mine/blob/master/src/main/java/com/dev/config/aop/BaseAop.java

1:輸入依存のmaven

 

<! - https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop - > 
<依存>
<groupIdを> org.springframework.boot </ groupIdを>
<たartifactId> spring-ブートスターター-AOP </たartifactId>
<バージョン> 2.1.6.RELEASE </バージョン>
</依存関係>

 

 

 

2:以下のように、クラスセクションとしてクラスを作成します。

 

パッケージcom.dev.config.aop。

輸入org.aspectj.lang.JoinPoint。
輸入org.aspectj.lang.ProceedingJoinPoint。
輸入 org.aspectj.lang.annotation *。;
輸入org.slf4j.Logger。
輸入org.slf4j.LoggerFactory;
輸入org.springframework.core.annotation.Order。

輸入java.util.Collections。

/ ** 
 * 2019年7月12日にzgq7によって作成されます。
* *各通知执行顺序: * 1:around-> * 2:ビフォー> * 3:around-> retrunコード- > * 4:アフター> * 5:afterReturning-> * 6:afterThrowing * </ P> * <P> *順序执行顺序: * 1:オブジェクトを入力する方法:小さい値を実行するため * 2:方法のうち目的:大きな値を実行するため * </ P>
* / @Aspect @Order( 1 パブリック クラスBaseAop { プライベート ファイナル =ログLoggerFactory.getLoggerロガー(この.getClass()); / ** *特定のカットポイント書き込み * 、それが正確である場合、パケットのクラス、ラインに正確である場合* @apiNote実行パスを「」。 2を得る。「」 * @apiNote実行パスのパッケージにのみ正確であれば、使用することはできません前、後、afterReturuning、4つの通知モジュールの起動エラー周り * * / @Pointcut(「実行(公開* com.dev。 controller.TestController.s())」公共 ボイドアスペクト(){ } / ** *その方法に入る前 * * / @Before(値 = "アスペクト()" 公共 ボイド前(ジョインポイントジョインポイント){ log.info( "前:パラメータタイプ:{}" 、joinPoint.getArgs()) ; } / ** *(Retrun前に行う)、スライスする前にデータを返す * * / @After(値 = "アスペクト()" 公共 ボイド後(ジョインポイントジョインポイント){ log.info(復帰前「AOP:{} " 、joinPoint.toLongString()); } / ** *スライスデータの後戻り 型メソッドをパスを戻る* joinPoint.getSignature()メソッド ** / @AfterReturning(値 = "結果"を返す= "アスペクト()" 公共 ボイドafterReturning(結果オブジェクト){ log.info( "復帰後AOPは:結果を返す:{}" 結果); } / ** *サラウンド通知 * 1:前前 * 2:afterReturning後 * @Around型ProceedingJoinPointに連絡しなければならないメソッドのパラメータ、:* @apiNote 1 * @apiNote 2:proceedingJoinPoint.proceed()は@AfterReturningで生成された結果でありますその結果は、デバッガがデバッグすることができます ので、例外はキャッチしない@AfterThrowing大手、@Aroundにキャッチされる、先に実行を@AfterThrowingの@Aroundが先の方法の目的の実現の結果を得るためにあるので、と@Around:* @apiNote 3例外は、@AfterThrowingと混合しそう@Around * * / //@Around(値= "アスペクト()") パブリックオブジェクトの周囲(ProceedingJoinPoint proceedingJoinPoint){ log.info( "AOPのarrounding:{}" 。、proceedingJoinPoint.getSignature()のgetName())。 試す{ 返すproceedingJoinPoint.proceedを(); } キャッチ(Throwableをスロー可能){ log.info( "AOP arroundingエラー:{}" あとでThrowable.getMessage())。 // throwable.printStackTrace(); 返すCollections.EMPTY_MAPを。 } } / ** *切面报错 * * / @AfterThrowing(値= "アスペクト()"、投げ= "例外" 公共 ボイドafterThrowing(Throwableの例外){ log.error( "例外が発生し、MSG:{}" 、exception.getMessage())。 もし(例外のinstanceof のNullPointerException) log.info( "空指针异常" ); } }

 

 

アスペクトの複数の実行順序:notice2.1

  1:実行値を下げるため:客観的な方法を入力するとき

  2:ときにオブジェクトメソッドのうち:大きな値を実行するため

notice2.2:、@ afterThrowingの周りに、@ afterReturning、@の後に@ befer、@の実行順序の様相

1 *:around-> 
 * 2:ビフォー> 
 。* 3:around-> Retrunコード- > 
 * 4:アフター> 
 。* 5:afterReturningの
notice2.2.1:オーダー通知に厳密に従って値も転写層であってもよいです層を行きます

notice2.3:法の下で@Aroundにおけるアスペクト戻り値を持っている必要があり、それ以外の場合は「問題」セクションの

* @ApiNote 1:パラメータのアクセス方法は、@Around型ProceedingJoinPointでなければならない
 proceedingJoinPoint.proceed()デバッグしなければならない結果@AfterReturningもたらす:* @apiNote 2

 

notice2.4:@afterThrowingと混合されていない@Aroundのアスペクト

 * @ApiNote 3:@Aroundが先の方法の目的の実現の結果の取得、および実行を@AfterThrowingの先駆け@Aroundするので、その例外が例外をキャッチし、そのためではない@AfterThrowing大手、@Aroundに巻き込まれる@Around @AfterThrowingミックス

 

notice2.5:パッケージまたはクラスパス実行パスの問題でアスペクト@PointCut

* @ApiNoteの実行パス。「」それはクラスに正確である場合には、袋がちょうど二つを持っている場合は、行は、「」
 *パケットの@ApiNote実行パス場合のみ、正確な、前に使用することはできません、後に、 4つの通知モジュールの起動エラー周りのafterReturuning、










ひどく書かれた要約のか悪いの希望私を許し、そう満ち、間違いを指摘してください。


 

 

おすすめ

転載: www.cnblogs.com/zgq7/p/11310142.html