JDK1.5で導入されたJavaアノテーションは、Springフレームワークも、その頭の上にJavaの注釈であることを起こります。
以下は、AOP(アスペクト指向プログラミング)のコンセプト春のフレームが参加する単純なプロセスの春カスタム注釈を、説明します。
Javaのカスタム注釈:Javaのアノテーションは明らかではない、あなたは、javaカスタム注釈を理解することができます
まず、カスタムアノテーションを作成します
パラメータrequestUrlは、私たちの習慣であります
パッケージcomsamannotation。 輸入 java.lang.annotation *。; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @継承されました パブリック @のインタフェースMyLog { ストリングrequestUrl()。 }
第二に、コメントを解決
AOPバネが、ここで使用されている(指向プログラミング)の特性
クラス別@Aspectコメントは、クラスのセクションになります
@Pointcutによって修飾方法は@MyLogで注釈さMyLog注釈タイプの指定されたエントリポイントは、出発点を入力するエントリポイントを指定。
- アドバイスの前に@Before:アドバイスが参加ポイントの前に実行されるが、(それが例外をスローしない限り)、この通知の前に実行フローの接続ポイントを停止することはできません。
- @Aroundアドバイス周り:操作が実行される方法を行うことができる前と後に、方法は、(point.proceed内で実行される必要がある)と、結果を返します。
- ポスト通知@AfterReturning:正常復帰を例外をスローすることなく、例えば、方法:接続ポイントが正常に完了した後に実行通知。
- @AfterThrowing例外通知:例外はexitメソッドスローされたときのアドバイスが実行されます。
- @Afterポスト通知:実行が正常に完了を通知する際の接続点:正常復帰を例外をスローすることなく、例えば、方法。
パッケージcomsamannotation。 輸入org.aspectj.lang.JoinPoint。 輸入org.aspectj.lang.ProceedingJoinPoint。 輸入 org.aspectj.lang.annotation *。; 輸入org.aspectj.lang.reflect.MethodSignature。 輸入org.springframework.stereotype.Component。 輸入java.lang.reflect.Methodオブジェクト。 @Aspect // AOP切面 @Component パブリック クラスMyLogAspect { // 切入点 @Pointcut(値= "@Annotation(com.sam.annotation.MyLog)" ) プライベート ボイドポイントカット(){ } / ** *実行方法の前と後 * * @paramのポイント * @Param MyLog * @return * / @Around(値 = "ポイントカット()&& @Annotation(myLog)" ) 公衆の周りにオブジェクト(ProceedingJoinPoint点、MyLog myLog){ System.out.println( "++++ ++++方法の周りに実行" )。 ストリングrequestUrl = myLog.requestUrl()。 // インターセプトクラス名 、クラスclazz = point.getTarget()のgetClass();. // 方法はインターセプト 法、メソッド= ((MethodSignature)point.getSignature())getMethod()メソッドを.; System.out.println( "実行クラス:" + clazz + "方法:" +メソッド"カスタム要求アドレス:" + + requestUrl)。 試す{ リターン)(point.proceedを。// 执行程序 } キャッチ(Throwableをスロー可能){ throwable.printStackTrace(); 返すあとでThrowable.getMessageを(); } } / ** *メソッド実行 * * @param ジョインポイント * @Param MyLog * @paramの結果 * @return * / @AfterReturning(値 = "ポイントカット()&& @Annotation(myLog)" = "結果"を返す) パブリックオブジェクトafterReturning(ジョインポイントジョインポイント、MyLog myLog、オブジェクト結果){ // HttpServletRequestのリクエスト=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())のGetRequest()。 // HttpSessionのセッション=でrequest.getSession(); System.out.println( "++++执行了afterReturning方法++++" ); System.out.println( "実行結果:" + 結果)。 戻り値の結果; } / ** *メソッドが実行さと投げ * * @param ジョインポイント * @Param MyLog * @paramのEX * / @AfterThrowing(値 = "ポイントカット()&& @Annotation(myLog)" = "EX"を投げる) 公共 ボイドafterThrowing(ジョインポイントジョインポイント、MyLog myLog、例外例){ System.out.println( "++++ ++++行わafterThrowing法" )。 System.out.println( "要求:" + myLog.requestUrl()+ "異常" ); } }
カスタム注釈の第三に、使用
コントローラに直接注釈を使用@MyLog
パッケージcom.sam.controller。 輸入com.sam.annotation.MyLog。 輸入org.springframework.web.bind.annotation.RequestMapping。 輸入org.springframework.web.bind.annotation.RequestMethod; 輸入org.springframework.web.bind.annotation.RestController。 @RestController @RequestMapping(値 = "/インデックス" ) パブリック クラスIndexController { @MyLog(requestUrl = "/要求指数" ) @RequestMapping(メソッド = RequestMethod.GET) パブリック文字列インデックス(){ 戻り "インデックス" 。 } }
プロジェクト、訪問を起動し、http:// localhost:8080 /インデックス
結果
++++执行了around方法++++
执行了 类:class com.yfs.controller.IndexController 方法:public java.lang.String com.yfs.controller.IndexController.index() 自定义请求地址:/index请求
++++执行了afterReturning方法++++
执行结果:index
春は多くのカスタムアクションを実行する必要があり、カスタム注釈を実装するために簡単な手順上記で説明し、あなたがクラス内のセクションでプログラムする必要があります。
出典ます。https://my.oschina.net/magicalSam/blog/1359369