在 Spring Boot 中優雅的計算方法執行時間
計算方法執行時間是大多數后端應用程序中常見的非功能性需求。以下是一些計算執行時間的傳統方法:
long startTime = (System.currentTimeMillis());
// 你的邏輯代碼
long executionTime = (System.currentTimeMillis() - startTime) / 1000;
LOGGER.info("計算所花費的時間為:{} 秒", executionTime);
StopWatch watch = new StopWatch();
watch.start();
// 你的邏輯代碼
watch.stop();
LOGGER.info("計算所花費的時間為:{} 秒", watch.getTotalTimeSeconds());可以看到需要在每個需要計算執行時間的方法里增加相同的計算代碼,這種統計代碼執行時間的方式存在代碼冗余、違反 DRY 原則、侵入性強等問題。
接下來讓我們通過 AOP 來實現在方法頂部添加一個注解,就可以非常高效地計算所有方法的執行時間的功能。

步驟一:啟用 Spring AOP
首先,通過在 POM.xml 中添加以下內容來啟用 Spring AOP:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>步驟二:創建自定義注解
現在讓我們在 Spring Boot 中創建一個名為 ExecutionTimeLogger 的自定義注解。可以看到,該注解在運行時起作用,并且適用于方法級別。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecutionTimeLogger {
}步驟三:創建切面類
創建一個作為切面的新類,包含計算方法執行時間的邏輯。在 Spring AOP 中有多種使用切面的方式,這里使用 @Around 注解。創建 ExecutionTimeLoggerAspect 類并使用 @Aspect 注解,再創建 executionTimeLogger 方法并添加 @Around 注解,將注解名稱作為參數傳遞給 @Around,這樣該方法會在帶 ExecutionTimeLogger 注解的方法執行前后被調用:
@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("{}方法在{}毫秒內執行完畢", joinPoint.getSignature(), executionTime);
return proceed;
} catch (Throwable e) {
logger.error("在計算{}方法執行時間時出錯", joinPoint.getSignature(), e);
return null;
}
}
}步驟四:使用自定義注解
所有必需的配置都已完成。現在我們唯一需要做的就是在想要計算 Java 代碼中方法執行時間的地方使用該注解。假設要計算方法的執行時間,如下面的代碼所示。只需在方法頂部添加注解即可。
public class CustomLoggingService {
@ExecutionTimeLogger
public void myMethod() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}步驟五:查看輸出
當 myMethod 在你的代碼中執行時的輸出:
c.n.t.a.ExecutionTimeLoggerAspect|void com.main.project.CustomLoggingService.myMethod()方法在20毫秒內執行完畢是不是很簡單?想象一下節省了多少時間和精力。只需寫一遍計算執行時間的代碼,然后在需要計算執行時間的地方繼續使用注解即可。
總結一下:
- 創建自定義注解。
- 創建 @Aspect 類,包含計算執行時間的方法。
- 用 @Around 聲明方法并指定為自定義注解執行。
- 在要記錄執行時間的方法上加注解。


























