专栏首页后端Coderjava进阶|基于springAop和自定义注解进行方法的耗时统计

java进阶|基于springAop和自定义注解进行方法的耗时统计

本想着基于aop做些比较实际一点的业务场景,但是服务器不给力,暂时没法连接上了,额,这也是自己没有去写其它内容的客观原因之一了,因为涉及不了数据库层面,所以慢慢拖到了现在,也只有在写一些代码层面的内容了,写完这篇就暂时不写了,今年还有其它事情要做。

首先,引入spring框架提供的aop依赖包。

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>

然后自定义一个注解,用于标注标识一下,很简单,生命周期是运行时,作用域在方法上,因为我这里主要就是统计方法的耗时时间的。

package com.wpw.springbootjuc.controller;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解,统计方法执行耗时时间
 * wpw
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CountTime {
}

然后我们定义一个切面类,用于处理请求时的内容。

package com.wpw.springbootjuc.controller;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * 定义一个统计方法执行耗时的切面类
 *
 * @author wpw
 */
@Aspect
@Component//使用spring容器进行管理
@Slf4j
public class CountTimeAspect {
    /**
     * 首先定义一个切点
     */
    @org.aspectj.lang.annotation.Pointcut("@annotation(com.wpw.springbootjuc.controller.CountTime)")
    public void countTime() {
    }

    @Around("countTime()")
    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 + "毫秒");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }

}

定义一个切面,然后执行环绕通知,进行方法的统计时间,进行日志的输出打印。

这里就是最后的示例程序进行模拟了。

package com.wpw.springbootjuc.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * 统计调用一个方法的耗时时长
 *
 * @author wpw
 */
@RestController
public class CountTimeController {
    @CountTime
    @GetMapping(value = "/time")
    public String helloCount() {
        final Long sleepTime = 6L;
        try {
            TimeUnit.SECONDS.sleep(sleepTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "hello countTime";
    }

    @CountTime
    @RequestMapping(value = "/count")
    public String countTime() {
        final int count = 10000;
        for (int i = 0; i < count; i++) {

        }
        return "hello";
    }
}

以上就是整个基于aop加上自定义注解进行统计方法耗时的过程,简单快速,后面有时间会基于redis做一下比较有意思的一个场景的内容,内容就到这里结束了。

本文分享自微信公众号 - WwpwW(gh_245290c1861a),作者:后端Coder

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java之异步线程Executor

    说起异步,下意识就想到同步,这两个概念每个人都有着不同的理解,在这我们只是提下这关键词,具体的理解,可自行斟酌。

    码农王同学
  • java高级进阶|SpringCloud之服务调用组件Feign

    Feign是一个声明式WebService客户端,使用Feign能让编写WebService客户端更加简单,它的使用方式是定义一个接口,然后在上面添加 注解,同...

    码农王同学
  • java校验器的使用

    给自己总结一篇简单的使用校验器对入参参数是否合法判断的文章,文章的内容很容易理解,下面我们看下示例程序就可以大致明白了。

    码农王同学
  • SpringCloud gateway跨域配置

    天涯泪小武
  • @EnableDiscoveryClient和@EnableEurekaClient的区别?

    @EnableDiscoveryClient和@EnableEurekaClient的区别?在前面的服务提供者的例子中我们是用@EnableEurekaClie...

    马克java社区
  • Spring Boot---(24)springboot整合RabbitMQ

    访问接口:http://localhost:8088/mq1/getUser1 然后访问控制台(上一篇:centOs安装rabbitMQ 有配置控制台的步骤...

    IT云清
  • (16)SpringBoot整合RabbitMQ

    https://blog.csdn.net/weixin_39800144/article/details/89037698

    IT云清
  • Spring security笔记4/4: 自定义成功和失败

    重命名 Case3Application.java 为 Case4Application.java

    tonglei0429
  • springCloud Eureca服务提供者Provider的项目

    服务提供者的项目: 本例子是把前面springboot的mybatis例子,几乎不变的拿过来就可以运行了。 package com; import java...

    马克java社区
  • SpringBoot 整合 gradle 集成ActiveMQ

    https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-...

    Java深度编程

扫码关注云+社区

领取腾讯云代金券