最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Spring AOP記錄方法的執(zhí)行時間

 更新時間:2016年09月22日 10:44:14   投稿:daisy  
這篇文章給大家介紹的是spring的aop來實現(xiàn)方法級的執(zhí)行時間的記錄監(jiān)控,以此來評估方法的性能以及針對性的對已存在的方法進行優(yōu)化。對于監(jiān)控,我們比較關注監(jiān)控的可靠性和性能,準確,高效,這才能在不影響整體性能的情況下對我們的系統(tǒng)性能有個較準確的認識。

一、前言

對于spring aop這個我就不多介紹了,網上一搜一大把,使用過spring的人都知道spring的ioc和aop。ioc我們常用,但在我們自己的系統(tǒng)中,aop的使用幾乎為零,除了這個監(jiān)控的小功能應用到了,其他的基本上沒有使用到。下面小編就給大家整理下利用Spring AOP記錄方法執(zhí)行時間的解決方案,有需要的一起看看吧。

二、解決方案

1、傳統(tǒng)方法

最簡單、粗暴的方法是給各個需要統(tǒng)計的方法開始和結尾處加的時間戳,然后差值計算結果即可,代碼如下:

long startTime = System.currentTimeMillis();

// 業(yè)務代碼

long endTime = System.currentTimeMillis(); 
System.out.println("程序運行時間:" + (endTime - startTime) + "ms"); //輸出程序運行時間 

這樣的方式需要給很多統(tǒng)計方法都加上耗時時間的代碼,這些代碼與核心業(yè)務無關卻大量重復、分散在各處,維護起來也困難。

2、面向切面編程的方法

所以,不推薦使用上面壞味道的代碼。想了很久,打算利用Spring AOP的思想來完成這個功能,話不多說代碼和相關的解釋如下:

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.reflect.MethodSignature; 
import org.springframework.stereotype.Component;

/**
 * 檢測方法執(zhí)行耗時的spring切面類
 * 使用@Aspect注解的類,Spring將會把它當作一個特殊的Bean(一個切面),也就是不對這個類本身進行動態(tài)代理
 * @author blinkfox
 * @date 2016-07-04
 */
@Aspect
@Component
public class TimeInterceptor {

 private static Log logger = LogFactory.getLog(TimeInterceptor.class);

 // 一分鐘,即1000ms
 private static final long ONE_MINUTE = 1000;

 // service層的統(tǒng)計耗時切面,類型必須為final String類型的,注解里要使用的變量只能是靜態(tài)常量類型的
 public static final String POINT = "execution (* com.blinkfox.test.service.impl.*.*(..))";

 /**
  * 統(tǒng)計方法執(zhí)行耗時Around環(huán)繞通知
  * @param joinPoint
  * @return
  */
 @Around(POINT)
 public Object timeAround(ProceedingJoinPoint joinPoint) {
  // 定義返回對象、得到方法需要的參數(shù)
  Object obj = null;
  Object[] args = joinPoint.getArgs();
  long startTime = System.currentTimeMillis();

  try {
   obj = joinPoint.proceed(args);
  } catch (Throwable e) {
   logger.error("統(tǒng)計某方法執(zhí)行耗時環(huán)繞通知出錯", e);
  }

  // 獲取執(zhí)行的方法名
  long endTime = System.currentTimeMillis();
  MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  String methodName = signature.getDeclaringTypeName() + "." + signature.getName();

  // 打印耗時的信息
  this.printExecTime(methodName, startTime, endTime);

  return obj;
 }

 /**
  * 打印方法執(zhí)行耗時的信息,如果超過了一定的時間,才打印
  * @param methodName
  * @param startTime
  * @param endTime
  */
 private void printExecTime(String methodName, long startTime, long endTime) {
  long diffTime = endTime - startTime;
  if (diffTime > ONE_MINUTE) {
   logger.warn("-----" + methodName + " 方法執(zhí)行耗時:" + diffTime + " ms");
  }
 }

}

注意:最后還需要在applicationContext.xml文件中加上AOP需要的配置<aop:aspectj-autoproxy/>,這樣Spring才能識別到它。

總結

以上就是關于利用Spring AOP記錄方法執(zhí)行時間的全部內容,希望這篇文章的內容對大家的學習或者工作帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Java實現(xiàn)冪等性校驗的示例代碼

    Java實現(xiàn)冪等性校驗的示例代碼

    我們在做web應用的時候通常會遇到前端提交按鈕重復點擊的場景,在某些新增操作上就需要做冪等性限制來保證數(shù)據的可靠性,所以本文主要介紹了如何使用java?aop實現(xiàn)冪等性校驗,需要的可以參考下
    2024-02-02
  • Java雙向鏈表倒置功能實現(xiàn)過程解析

    Java雙向鏈表倒置功能實現(xiàn)過程解析

    這篇文章主要介紹了Java雙向鏈表倒置功能實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java中如何靈活獲取excel中的數(shù)據

    Java中如何靈活獲取excel中的數(shù)據

    這篇文章主要給大家介紹了關于Java中如何靈活獲取excel中的數(shù)據,在日常工作中我們常常會進行文件讀寫操作,除去我們最常用的純文本文件讀寫,更多時候我們需要對Excel中的數(shù)據進行讀取操作,需要的朋友可以參考下
    2023-07-07
  • 詳解Spring中的Transactional屬性

    詳解Spring中的Transactional屬性

    今天我在寫代碼的時候,看到了一個注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,這個注解的用法,,需要的朋友可以參考下
    2021-05-05
  • java實現(xiàn)圖片轉base64字符串 java實現(xiàn)base64字符串轉圖片

    java實現(xiàn)圖片轉base64字符串 java實現(xiàn)base64字符串轉圖片

    這篇文章主要為大家詳細介紹了java實現(xiàn)圖片轉base64字符串,java實現(xiàn)base64字符串轉圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 詳解Java爬蟲利器Jsoup

    詳解Java爬蟲利器Jsoup

    Jsoup是一款Java語言開發(fā)的HTML解析器,用于解析HTML文檔以及對HTML文檔進行操作,處理等,本文就將詳細給大家介紹一下Java中的爬蟲利器Jsoup,感興趣的同學可以參考一下
    2023-06-06
  • Spring擴展點之BeanFactoryPostProcessor詳解

    Spring擴展點之BeanFactoryPostProcessor詳解

    這篇文章主要介紹了Spring擴展點之BeanFactoryPostProcessor詳解,Spring的設計非常優(yōu)雅,有很多的擴展點供我們對項目進行擴展,今天學習一下Spring其中擴展點之一的BeanFactoryPostProcessor,需要的朋友可以參考下
    2023-11-11
  • Kotlin中?StateFlow?或?SharedFlow?的區(qū)別解析

    Kotlin中?StateFlow?或?SharedFlow?的區(qū)別解析

    Kotlin協(xié)程中的StateFlow和SharedFlow是響應式數(shù)據流,分別用于UI狀態(tài)管理和事件通知,StateFlow有初始值,只保留最新值,適用于UI狀態(tài)管理;SharedFlow沒有初始值,可以配置緩存大小,適用于事件通知,感興趣的朋友一起看看吧
    2025-03-03
  • SpringBoot訪問不到controller的解決方案

    SpringBoot訪問不到controller的解決方案

    這篇文章主要介紹了SpringBoot訪問不到controller的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java之StringBuffer常見使用方法解析

    java之StringBuffer常見使用方法解析

    這篇文章主要介紹了java之StringBuffer常見使用方法解析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論

太湖县| 夏津县| 铅山县| 宣汉县| 平潭县| 灵川县| 新安县| 大丰市| 孝昌县| 兴化市| 安仁县| 洛川县| 象山县| 英超| 揭阳市| 任丘市| 定兴县| 北票市| 彩票| 汉源县| 平南县| 济南市| 湘乡市| 上犹县| 通许县| 平顶山市| 永年县| 岳普湖县| 施秉县| 彭阳县| 江山市| 苏尼特左旗| 富民县| 丰宁| 恩平市| 桐城市| 德江县| 青冈县| 芜湖市| 阜新| 道真|