国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

利用Spring AOP記錄方法的執行時間

2019-11-26 13:48:16
字體:
來源:轉載
供稿:網友

一、前言

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

二、解決方案

1、傳統方法

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

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

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

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;/** * 檢測方法執行耗時的spring切面類 * 使用@Aspect注解的類,Spring將會把它當作一個特殊的Bean(一個切面),也就是不對這個類本身進行動態代理 * @author blinkfox * @date 2016-07-04 */@Aspect@Componentpublic class TimeInterceptor { private static Log logger = LogFactory.getLog(TimeInterceptor.class); // 一分鐘,即1000ms private static final long ONE_MINUTE = 1000; // service層的統計耗時切面,類型必須為final String類型的,注解里要使用的變量只能是靜態常量類型的 public static final String POINT = "execution (* com.blinkfox.test.service.impl.*.*(..))"; /**  * 統計方法執行耗時Around環繞通知  * @param joinPoint  * @return  */ @Around(POINT) public Object timeAround(ProceedingJoinPoint joinPoint) {  // 定義返回對象、得到方法需要的參數  Object obj = null;  Object[] args = joinPoint.getArgs();  long startTime = System.currentTimeMillis();  try {   obj = joinPoint.proceed(args);  } catch (Throwable e) {   logger.error("統計某方法執行耗時環繞通知出錯", e);  }  // 獲取執行的方法名  long endTime = System.currentTimeMillis();  MethodSignature signature = (MethodSignature) joinPoint.getSignature();  String methodName = signature.getDeclaringTypeName() + "." + signature.getName();  // 打印耗時的信息  this.printExecTime(methodName, startTime, endTime);  return obj; } /**  * 打印方法執行耗時的信息,如果超過了一定的時間,才打印  * @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 + " 方法執行耗時:" + diffTime + " ms");  } }}

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通山县| 黄陵县| 辽宁省| 泽州县| 北碚区| 曲沃县| 商都县| 辉南县| 育儿| 武清区| 乐业县| 云和县| 白水县| 新建县| 民权县| 石渠县| 天门市| 姚安县| 普安县| 巩义市| 永平县| 安仁县| 宁远县| 京山县| 康定县| 安溪县| 桃园县| 清流县| 乡城县| 大宁县| 安岳县| 云龙县| 水城县| 望奎县| 安宁市| 房山区| 滨州市| 巧家县| 大港区| 城固县| 九龙县|