第一步,添加单位枚举PRTUnit

public enum PRTUnit {
    ms,
    second,
    minute,
    hour,
    day;
}

第二步,编写注解PrintRunTime

@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规则

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());
    }

}

第四步,测试

    @RequestMapping("/test1")
    @PrintRunTime(value = PRTUnit.second)
    public String test1() {
        return "redirect:/abc.html";
    }
2022-12-03 19:12:30.019  INFO 40198 --- [nio-8081-exec-6] c.z.s.aop.runtime.PrintRunTimeAop        : 方法名:test1 执行了0.0 second
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤