版权声明:本文为博主原创文章,未经博主允许不得转载。 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 小结
这样后续所有需要添加计时功能的方法,只需要一个注解就搞定了,是不是很方便,这里只是最简单的使用方法,我们可以在注解中携带更多的信息,在注解解析器里面做更多的通用逻辑处理,比如提供缓存的能力,记录日志的能力等等,这样即使后续该方面的逻辑需要修改,我们只需要在注解解析器这一个方法里面修改就可以了,避免牵一发而动全身。