本页目录
- 第一步,添加单位枚举PRTUnit
- 第二步,编写注解PrintRunTime
- 第三步,配置AOP规则
- 第四步,测试
第一步,添加单位枚举PRTUnit
代码语言:javascript复制public enum PRTUnit {
ms,
second,
minute,
hour,
day;
}
第二步,编写注解PrintRunTime
代码语言:javascript复制@Documented
@Target(ElementType.METHOD) // 作用与方法上
@Retention(RetentionPolicy.RUNTIME) // RUNTIME: 在运行时有效(即运行时保留)
public @interface PrintRunTime {
@AliasFor("unit") // @AliasFor 表示其可与unit互换别名:当注解指定value时,为unit赋值
PRTUnit value() default PRTUnit.ms;
// 定义单个文件最大限制
@AliasFor("value") // @AliasFor 表示其可与value互换别名:当注解指定unit时,为value赋值
PRTUnit unit() default PRTUnit.ms;
}
第三步,配置AOP规则
代码语言:javascript复制import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class PrintRunTimeAop {
private static final TimeInterval timer = DateUtil.timer();
// 注意,这里要指定注解的全限定类名。不然无法进入AOP拦截自定义注解PrintRunTime
@Pointcut("@annotation(com.zanglikun.springdataredisdemo.aop.runtime.PrintRunTime)")
public void pointcut() {
}
/**
* 方法体执行之前执行
*/
@Before("pointcut()")
public void beforeMethadRun(JoinPoint joinPoint) {
// 使用Hutool的代码运行时间工具
timer.restart();
}
@After("pointcut()")
public void afterMethedEnd(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
PrintRunTime annotation = AnnotationUtils.getAnnotation(signature.getMethod(), PrintRunTime.class);
Double showTime = 0.0;
if (StringUtils.equals("ms", annotation.unit().toString())) {
showTime = timer.intervalMs();
} else if (StringUtils.equals("second", annotation.unit().toString())) {
showTime = timer.intervalSecond();
} else if (StringUtils.equals("min", annotation.unit().toString())) {
showTime = timer.intervalMinute();
} else if (StringUtils.equals("hour", annotation.unit().toString())) {
showTime = timer.intervalHour();
} else if (StringUtils.equals("day", annotation.unit().toString())) {
showTime = timer.intervalDay();
} else {
log.error("Unit Exception");
}
log.info("方法名:{} 执行了:{} {}", signature.getMethod().getName(), showTime, annotation.unit().toString());
}
}
第四步,测试
代码语言:javascript复制 @RequestMapping("/test1")
@PrintRunTime(value = PRTUnit.second)
public String test1() {
return "redirect:/abc.html";
}
代码语言:javascript复制2022-12-03 19:12:30.019 INFO 40198 --- [nio-8081-exec-6] c.z.s.aop.runtime.PrintRunTimeAop : 方法名:test1 执行了0.0 second
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!