1. 程式人生 > >自定義註解簡單計算方法耗時

自定義註解簡單計算方法耗時

一.需求來源

很多方法我們需要跟蹤它的時間消耗,但是頻繁的新增日誌又顯得很冗餘,因此使用註解來優雅的開啟計時功能

二.直接上程式碼

2.1 首先新增依賴

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
    </dependencies>

2.2 然後定義一個註解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableCountTime {


}

2.3 再定義註解的解析器

@Component
@Aspect
public class EnableCountTimeAspect {

    @Around("@annotation(ect)")
    public Object doAround(ProceedingJoinPoint pjp, EnableCountTime ect) throws Throwable {
        long begin = System.currentTimeMillis();
        Object obj = pjp.proceed();
        String methodName = pjp.getSignature().getName();
        String className = pjp.getSignature().getDeclaringTypeName();
        System.out.println(className + "." + methodName + " 方法消耗時間:" + (System.currentTimeMillis() - begin) + " ms");
        return obj;
    }
}

2.4 測試

@RestController
@RequestMapping("/test")
public class HelloController {

    @EnableCountTime
    @GetMapping("/a")
    public String testA(){
        return "hello a!";
    }
}

瀏覽器訪問/test/a介面,即可列印如下:
com.intellif.mozping.controller.HelloController.testA 方法消耗時間:1 ms

2.5 小結

這樣後續所有需要新增計時功能的方法,只需要一個註解就搞定了,是不是很方便,這裡只是最簡單的使用方法,我們可以在註解中攜帶更多的資訊,在註解解析器裡面做更多的通用邏輯處理,比如提供快取的能力,記錄日誌的能力等等,這樣即使後續該方面的邏輯需要修改,我們只需要在註解解析器這一個方法裡面修改就可以了,避免牽一髮而動全身。