使用Springboot 自定义注解完成 统计函数耗时功能

使用Springboot 自定义注解完成 统计函数耗时功能

pom 导入依赖

建立springboot项目,在pom中导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

自定义注解 costTime

package  com.costtime.annotation.entity;

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

}

其中

元注解:负责注解其他注解
@Target,@Retention,@Documented,@Inherited

@Target:用于描述注解的使用范围
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention: 定义了该Annotation被保留的时间长短:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

定义一个切面类,用于定义处理请求内容

package com.costtime.annotation.aop;

@Aspect
@Component//使用spring容器进行管理
@Slf4j
public class CostTimeAspect {
    /**
     * 首先定义一个切点
     */
    @org.aspectj.lang.annotation.Pointcut("@annotation(com.counttime.annotation.entity.CostTime)")
    public void countTime() {
    }
    @Around("costTime()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object obj = null;
        try {
            long beginTime = System.currentTimeMillis();
            obj = joinPoint.proceed();
            //获取方法名称
            String methodName = joinPoint.getSignature().getName();
            //获取类名称
            String className = joinPoint.getSignature().getDeclaringTypeName();
            log.info("类:[{}],方法:[{}]耗时时间为:[{}]", className, methodName, (System.currentTimeMillis() - beginTime)/1000 + "秒");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }
}

定义Controller,测试结果

package com.counttime.annotation.controller;

@RestController
public class test {

    @CostTime
    @RequestMapping(value = "/count")
    public String countTime(@RequestParm("count") count) {
        if(count == 0)
            count = 1000;

        for (int i = 0; i < count; i++) {
        }
        return "complete the method!";
    }
}

通过游览器访问,并获取控制台打印信息

使用Springboot 自定义注解完成 统计函数耗时功能_第1张图片
在这里插入图片描述

你可能感兴趣的:(java,Springboot,自定义注解,计算耗时)