利用Spring AOP記錄方法的執(zhí)行時(shí)間
一、前言
對(duì)于spring aop這個(gè)我就不多介紹了,網(wǎng)上一搜一大把,使用過spring的人都知道spring的ioc和aop。ioc我們常用,但在我們自己的系統(tǒng)中,aop的使用幾乎為零,除了這個(gè)監(jiān)控的小功能應(yīng)用到了,其他的基本上沒有使用到。下面小編就給大家整理下利用Spring AOP記錄方法執(zhí)行時(shí)間的解決方案,有需要的一起看看吧。
二、解決方案
1、傳統(tǒng)方法
最簡(jiǎn)單、粗暴的方法是給各個(gè)需要統(tǒng)計(jì)的方法開始和結(jié)尾處加的時(shí)間戳,然后差值計(jì)算結(jié)果即可,代碼如下:
long startTime = System.currentTimeMillis(); // 業(yè)務(wù)代碼 long endTime = System.currentTimeMillis(); System.out.println("程序運(yùn)行時(shí)間:" + (endTime - startTime) + "ms"); //輸出程序運(yùn)行時(shí)間
這樣的方式需要給很多統(tǒng)計(jì)方法都加上耗時(shí)時(shí)間的代碼,這些代碼與核心業(yè)務(wù)無關(guān)卻大量重復(fù)、分散在各處,維護(hù)起來也困難。
2、面向切面編程的方法
所以,不推薦使用上面壞味道的代碼。想了很久,打算利用Spring AOP的思想來完成這個(gè)功能,話不多說代碼和相關(guān)的解釋如下:
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; /** * 檢測(cè)方法執(zhí)行耗時(shí)的spring切面類 * 使用@Aspect注解的類,Spring將會(huì)把它當(dāng)作一個(gè)特殊的Bean(一個(gè)切面),也就是不對(duì)這個(gè)類本身進(jìn)行動(dòng)態(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)計(jì)耗時(shí)切面,類型必須為final String類型的,注解里要使用的變量只能是靜態(tài)常量類型的 public static final String POINT = "execution (* com.blinkfox.test.service.impl.*.*(..))"; /** * 統(tǒng)計(jì)方法執(zhí)行耗時(shí)Around環(huán)繞通知 * @param joinPoint * @return */ @Around(POINT) public Object timeAround(ProceedingJoinPoint joinPoint) { // 定義返回對(duì)象、得到方法需要的參數(shù) Object obj = null; Object[] args = joinPoint.getArgs(); long startTime = System.currentTimeMillis(); try { obj = joinPoint.proceed(args); } catch (Throwable e) { logger.error("統(tǒng)計(jì)某方法執(zhí)行耗時(shí)環(huán)繞通知出錯(cuò)", e); } // 獲取執(zhí)行的方法名 long endTime = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String methodName = signature.getDeclaringTypeName() + "." + signature.getName(); // 打印耗時(shí)的信息 this.printExecTime(methodName, startTime, endTime); return obj; } /** * 打印方法執(zhí)行耗時(shí)的信息,如果超過了一定的時(shí)間,才打印 * @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í)行耗時(shí):" + diffTime + " ms"); } } }
注意:最后還需要在applicationContext.xml
文件中加上AOP需要的配置<aop:aspectj-autoproxy/>
,這樣Spring才能識(shí)別到它。
總結(jié)
以上就是關(guān)于利用Spring AOP記錄方法執(zhí)行時(shí)間的全部?jī)?nèi)容,希望這篇文章的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
springboot+vue實(shí)現(xiàn)登錄功能的最新方法整理
最近做項(xiàng)目時(shí)使用到了springboot+vue實(shí)現(xiàn)登錄功能的技術(shù),所以下面這篇文章主要給大家介紹了關(guān)于springboot+vue實(shí)現(xiàn)登錄功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06maven實(shí)現(xiàn)docker自動(dòng)化部署插件的使用
本文主要介紹了maven實(shí)現(xiàn)docker自動(dòng)化部署插件的使用,分享給大家,感興趣的小伙伴們可以參考一下2021-06-06java泛型的局限探究及知識(shí)點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于java泛型的局限探究及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-07-07Java8使用Stream流實(shí)現(xiàn)List列表查詢、統(tǒng)計(jì)、排序以及分組
List的Stream流操作可以簡(jiǎn)化我們的代碼,減少程序運(yùn)行的壓力,應(yīng)對(duì)上面的問題,下面這篇文章主要給大家介紹了關(guān)于Java8使用Stream流實(shí)現(xiàn)List列表查詢、統(tǒng)計(jì)、排序以及分組的相關(guān)資料,需要的朋友可以參考下2023-06-06java多線程學(xué)習(xí)之死鎖的模擬和避免(實(shí)例講解)
下面小編就為大家?guī)硪黄猨ava多線程學(xué)習(xí)之死鎖的模擬和避免(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法
這篇文章主要介紹了springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法 ,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05java操作mongodb時(shí),對(duì)象bean和DBObject相互轉(zhuǎn)換的方法(推薦)
下面小編就為大家?guī)硪黄猨ava操作mongodb時(shí),對(duì)象bean和DBObject相互轉(zhuǎn)換的方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)實(shí)戰(zhàn)教程(自定義校驗(yàn),分組校驗(yàn))
這篇文章主要介紹了SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)(自定義校驗(yàn),分組校驗(yàn))的實(shí)戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-07-07Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)
本文主要介紹了Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01