序文
SpringのAOPを指すプログラム実行しているコードの動的部分はに切断される指定されたメソッドの指定された位置動的プログラミングアプローチを動作させるための[エージェント]。
AOP機能テスト
①AOPモジュールのインポート
<dependency> <groupId> org.springframework </ groupId> <artifactId> spring-aspects </ artifactId> <version> 4.3.12.RELEASE </ version> </ dependency>
②論理コンポーネントとアスペクトクラスを定義する
論理コンポーネント
ビジネスロジックの実行中にログを出力します(メソッドの前、メソッドの実行後、メソッドは異常、xxx)
パブリック クラスMathCalculator { public int div(int i、int j){ System.out.println( "MathCalculator ... div ..." ); i / jを返す; } }
ファセット
アスペクトクラスのメソッドは、MathCalculator.divが実行および実行される場所を動的に検知する必要があります。
/ ** * カットフェイスクラスカットフェイスクラスで
あるクラスをSpringに通知する必要があります(カットフェイスクラスにメモを追加:@Aspect) * @Aspect:現在のクラスがカットフェイスクラスであることをSpringに伝えます * * / @Aspect パブリック クラスLogAspects { // 抽出パブリックエントリポイント式 // 1、このクラスはpointCut() // 2を参照、他のアスペクトはcom.atneusoft.springboot.aop.LogAspects.pointCut() @Pointcut( "execution(public int com.atneusoft.springboot .aop.MathCalculator。*(..)) " ) public void pointCut(){}; // @Before cut in before the target method; cut-in point expression(specify in which method in cut)
//実行するタイミングと場所でアスペクトクラスのターゲットメソッドをマークします(アノテーション@Before \ @After \ @AfterReturning \ @AfterThrowing)
// 事前通知(@Before):ターゲットメソッド(div)が実行さ れる前に @Beforeを実行します( "pointCut()" ) public void logStart(JoinPoint joinPoint){ Object [] args = joinPoint.getArgs(); System.out.println( "" + joinPoint.getSignature()。getName()+ "Run ... @Before:パラメータリストは次のとおりです:{"+ Arrays.asList(args)+"} " ); } //ポスト通知(@After):ターゲットメソッドの終了後に実行(div)(メソッドが正常に終了したか異常であるかに関係なく) End) @After(
"com.atneusoft.springboot.aop.LogAspects.pointCut()" ) public void logEnd(JoinPoint joinPoint){ System.out.println( "" + joinPoint.getSignature().GetName()+ "End ... @ After" ); } // JoinPointは、パラメータテーブルの最初の位置に表示される必要があります
//通知を返す(@AfterReturning ):ターゲットメソッド(div)が正常に戻った後に実行 @AfterReturning(value = "pointCut()"、returning = "result" ) public void logReturn(JoinPoint joinPoint、Object result){ System.out.println( "" + joinPoint .getSignature()。getName()+ "Return normal ... @ AfterReturning:Run result:{" + result + "}" ); } //例外通知(@AfterThrowing):ターゲットメソッド(div)に例外が発生した後に実行 @AfterThrowing(value = "pointCut()"、throwing = "exception" ) public voidlogException(JoinPoint joinPoint、Exception exception){ System.out.println( "" + joinPoint.getSignature()。getName()+ "异常。。。异常信息:{" + exception + "}" ); } }
③アスペクトクラスとビジネスロジッククラス(ターゲットメソッドが配置されているクラス)の両方をコンテナーに追加し、@ EnableAspectJAutoProxyを構成クラスに追加します[アノテーションベースのaopモードをオンにします。これは、次の構成ファイルの形式と同じです。
<!-注釈 バージョンに基づいてアスペクト関数をオンにする-> <aop:アスペクトj-autoproxy> </ aop:アスペクトj-autoproxy>
@EnableAspectJAutoProxy @Configuration public classMainConfigOfAOP { //コンテナにビジネスロジッククラスが追加されます @Bean publicMathCalculator Calculator(){ return newMathCalculator(); } //カット面クラスがコンテナに追加されます @ Bean publicLogAspects logAspects(){ return newLogAspects (); } }
まとめ
3つのステップ:
1)ビジネスロジックコンポーネントとアスペクトクラスをコンテナーに追加し、アスペクトクラス(@Aspect)であるSpringに
通知します2)アスペクトクラスの各通知メソッドに通知アノテーションをマークし、いつSpringに通知するか実行する場所(ポイントカット式)
3)、アノテーションベースのAOPモードを有効にします; @EnableAspectJAutoProxy