SpringBoot優(yōu)雅實(shí)現(xiàn)計(jì)算方法執(zhí)行時(shí)間
計(jì)算方法執(zhí)行時(shí)間是大多數(shù)后端應(yīng)用程序中常見的非功能性需求。以下是一些計(jì)算執(zhí)行時(shí)間的傳統(tǒng)方法:
long startTime = (System.currentTimeMillis());
// 你的邏輯代碼
long executionTime = (System.currentTimeMillis() - startTime) / 1000;
LOGGER.info("計(jì)算所花費(fèi)的時(shí)間為:{} 秒", executionTime);
StopWatch watch = new StopWatch();
watch.start();
// 你的邏輯代碼
watch.stop();
LOGGER.info("計(jì)算所花費(fèi)的時(shí)間為:{} 秒", watch.getTotalTimeSeconds());可以看到需要在每個(gè)需要計(jì)算執(zhí)行時(shí)間的方法里增加相同的計(jì)算代碼,這種統(tǒng)計(jì)代碼執(zhí)行時(shí)間的方式存在代碼冗余、違反 DRY 原則、侵入性強(qiáng)等問(wèn)題。
接下來(lái)讓我們通過(guò) AOP 來(lái)實(shí)現(xiàn)在方法頂部添加一個(gè)注解,就可以非常高效地計(jì)算所有方法的執(zhí)行時(shí)間的功能。
步驟一:?jiǎn)⒂?Spring AOP
首先,通過(guò)在 POM.xml 中添加以下內(nèi)容來(lái)啟用 Spring AOP:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>步驟二:創(chuàng)建自定義注解
現(xiàn)在讓我們?cè)?Spring Boot 中創(chuàng)建一個(gè)名為 ExecutionTimeLogger 的自定義注解??梢钥吹?,該注解在運(yùn)行時(shí)起作用,并且適用于方法級(jí)別。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecutionTimeLogger {
}步驟三:創(chuàng)建切面類
創(chuàng)建一個(gè)作為切面的新類,包含計(jì)算方法執(zhí)行時(shí)間的邏輯。在 Spring AOP 中有多種使用切面的方式,這里使用 @Around 注解。創(chuàng)建 ExecutionTimeLoggerAspect 類并使用 @Aspect 注解,再創(chuàng)建 executionTimeLogger 方法并添加 @Around 注解,將注解名稱作為參數(shù)傳遞給 @Around,這樣該方法會(huì)在帶 ExecutionTimeLogger 注解的方法執(zhí)行前后被調(diào)用:
@Aspect
@Component
publicclass ExecutionTimeLoggerAspect {
static final Logger logger = LoggerFactory.getLogger(ExecutionTimeLoggerAspect.class);
@Around("@annotation(ExecutionTimeLogger)")
public Object executionTimeLogger(ProceedingJoinPoint joinPoint) {
try {
long startTime = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long executionTime = (System.currentTimeMillis() - startTime);
logger.info("{}方法在{}毫秒內(nèi)執(zhí)行完畢", joinPoint.getSignature(), executionTime);
return proceed;
} catch (Throwable e) {
logger.error("在計(jì)算{}方法執(zhí)行時(shí)間時(shí)出錯(cuò)", joinPoint.getSignature(), e);
return null;
}
}
}步驟四:使用自定義注解
所有必需的配置都已完成?,F(xiàn)在我們唯一需要做的就是在想要計(jì)算 Java 代碼中方法執(zhí)行時(shí)間的地方使用該注解。假設(shè)要計(jì)算方法的執(zhí)行時(shí)間,如下面的代碼所示。只需在方法頂部添加注解即可。
public class CustomLoggingService {
@ExecutionTimeLogger
public void myMethod() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}步驟五:查看輸出
當(dāng) myMethod 在你的代碼中執(zhí)行時(shí)的輸出:
c.n.t.a.ExecutionTimeLoggerAspect|void com.main.project.CustomLoggingService.myMethod()方法在20毫秒內(nèi)執(zhí)行完畢
是不是很簡(jiǎn)單?想象一下節(jié)省了多少時(shí)間和精力。只需寫一遍計(jì)算執(zhí)行時(shí)間的代碼,然后在需要計(jì)算執(zhí)行時(shí)間的地方繼續(xù)使用注解即可。
總結(jié)一下
1.創(chuàng)建自定義注解。
2.創(chuàng)建 @Aspect 類,包含計(jì)算執(zhí)行時(shí)間的方法。
3.用 @Around 聲明方法并指定為自定義注解執(zhí)行。
4.在要記錄執(zhí)行時(shí)間的方法上加注解。
到此這篇關(guān)于SpringBoot優(yōu)雅實(shí)現(xiàn)計(jì)算方法執(zhí)行時(shí)間的文章就介紹到這了,更多相關(guān)SpringBoot計(jì)算方法執(zhí)行時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus中提供的各種注解詳細(xì)說(shuō)明
這篇文章主要介紹了MyBatis-Plus中提供的各種注解詳細(xì)說(shuō)明,下面對(duì)MyBatis-Plus提供的注解進(jìn)行整理,本文提供了部分示例代碼以方便理解,需要的朋友可以參考下2023-11-11
Java中隨機(jī)數(shù)的產(chǎn)生方式與原理詳解
這篇文章主要介紹了Java中隨機(jī)數(shù)的產(chǎn)生方式與原理詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11
springcloud集成nacos?使用lb?無(wú)效問(wèn)題解決方案
這篇文章主要介紹了解決springcloud集成nacos?使用lb?無(wú)效,通過(guò)查看spring-cloud-starter-gateway?jar中的自動(dòng)配置類的源碼,得知,該jar包中是不支持負(fù)載均衡的,需要引入spring-cloud-starter-loadbalancer?來(lái)支持,需要的朋友可以參考下2023-04-04
解決springboot MultipartFile文件上傳遇到的問(wèn)題
本文給大家?guī)?lái)了解決springboot MultipartFile文件上傳遇到的問(wèn)題,解決方法超簡(jiǎn)單,感興趣的朋友參考下本文2018-08-08
基于LinkedHashMap實(shí)現(xiàn)LRU緩存
LinkedHashMap是Java集合中一個(gè)常用的容器,它繼承了HashMap, 是一個(gè)有序的Hash表。那么該如何基于LinkedHashMap實(shí)現(xiàn)一個(gè)LRU緩存呢?本文將介紹LinkedHashMap的實(shí)現(xiàn)原理,感興趣的同學(xué)可以參考一下2023-05-05
Java線程編程中Thread類的基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了Java線程編程中Thread類的基礎(chǔ)學(xué)習(xí)教程,Thread類包含諸多操作線程的方法,非常重要,需要的朋友可以參考下2015-12-12
SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問(wèn)題及解決方案
這篇文章主要介紹了SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

