Spring AOP注解印刷方法実行時間

2700 ワード

問題
仕事の上でいつもいくつかの応答のとても遅いインターフェースに出会って、例えば私はマーケティングのエンジンをする時、多くの規則に出会って1つのタイマーの中で、このタイマーの運行時間は突然に急増します.ですから、どの規則がこんなに長く実行されていますか?
簡単な解決方法
  • の最も基本的な使い方は、システム時間
  • を通じて
    long start = System.currentTimeMillis();
    // doSomthing
    long spentTime = System.currentTimeMillis() -start;
    
    2、スプリングパッケージを使用するクラス
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    // doSomthing        
    stopWatch.stop();
    stopWatch.getTotalTimeMillis();
    
    分析
    以上の解決方法は一番よく使われています.最初から使っていましたが、複数の規則があったら、印刷時間が必要です.重複コードが多くて、見苦しいです.ご迷惑をおかけします.この時、私は切断面向けプログラミング(AOP)を思い出しました.注解によって時間を印刷します.
    カットシーン
    私たちはオブジェクト指向プログラミング(OOP)、インターフェースプログラミング(IOP)があることを知っています.これらはすべて相補的で、直接プログラミングに向けてプログラマがコア業務の開発に専念できるようにします.AOPで実現できます

    はい、以上の了解がありました.今はAOPがどのように注釈印刷方法の実行時間を実現するかを見てみましょう.
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExecuteTime {
        String name() default "";
    }
    
    注釈で印刷したいですが、まずコメントを書いてください.
    @Aspect
    @Component
    public class ExecuteTimeAspect {
    
        private final Logger logger = LoggerFactory.getLogger(ExecuteTimeAspect.class);
    
        @Pointcut("@annotation(executeTime)")
        public void serviceExecutionTimeLog(ExecuteTime executeTime) {
        }
    
    
        @Around(value = "serviceExecutionTimeLog(executeTime)", argNames = "proceedingJoinPoint,executeTime")
        public Object doAfter(ProceedingJoinPoint proceedingJoinPoint, ExecuteTime executeTime) throws Throwable {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            Object proceed = proceedingJoinPoint.proceed();
            stopWatch.stop();
    
            logger.info("execute-time-name : [{}], execution-time : [{}], class-method : [{}]", executeTime.name(),
                    stopWatch.getTotalTimeMillis(),
                    proceedingJoinPoint.getTarget().getClass().getName() + "." + proceedingJoinPoint.getSignature().getName());
    
    
            return proceed;
        }
    }
    
  • は、まず、一つの断面appect
  • を定義する.
  • は、接点pointcutを定義し、どのようなjoin point(方法の接続点)が実行されるべきかを記述し、ここでは注釈によって実行されるのです.他の説明もあります.あなたの接点範囲
  • を定義してもいいです.
  • は、実行方法の前後に実行すべき関連動作のaroundを定義する.その中で、Object proced=proceeding JoinPoinPoint.proceed();関数の実行を表します.その前後は開始時間と終了時間で囲みます.
  • 最後に、ユーザー定義の名前(自分で名前をつけて、オンラインで速く大量にあなたの見たいデータを印刷します.)を印刷して、方法名と実行時間を実行します.
    @Override
    @ExecuteTime(name = "user-defined")
    public void calculate(){
    // TODO
    }
    
    実現されたインターフェースに注解して使えます.
    派生的な問題
  • 、スプリング事務のソースコードを見たいですが、どうやって実現しますか?
  • 参照
  • https://segmentfault.com/a/1190000007469982#articleHeader2
  • https://www.jianshu.com/p/7b072f31bd1d
  • もし違った考えがあれば、メッセージで検討してください.