AOPと一緒に春のカスタム注釈、簡単な構成ログの注釈(RPM)

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

 

おすすめ

転載: www.cnblogs.com/myseries/p/11729260.html