自定义注解简单计算方法耗时

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/my_momo_csdn/article/details/85281352

一.需求来源

很多方法我们需要跟踪它的时间消耗,但是频繁的添加日志又显得很冗余,因此使用注解来优雅的开启计时功能

二.直接上代码

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 小结

这样后续所有需要添加计时功能的方法,只需要一个注解就搞定了,是不是很方便,这里只是最简单的使用方法,我们可以在注解中携带更多的信息,在注解解析器里面做更多的通用逻辑处理,比如提供缓存的能力,记录日志的能力等等,这样即使后续该方面的逻辑需要修改,我们只需要在注解解析器这一个方法里面修改就可以了,避免牵一发而动全身。

猜你喜欢

转载自blog.csdn.net/my_momo_csdn/article/details/85281352