项目中需要统计某些方法的执行时间,最简易的方式是方法执行前记录时间戳startTime,在方法结束前,用时间戳endTime-startTime得出该方法耗时。
但是为了避免无代码侵入并实现通用,于是定义一个注解,如果要统计哪个方法,只需在方法上写上注解即可,通过注解可以获取到方法的参数、方法名、返回值等等信息。

下面是一个简单的时间统计实现:

1.定义一个注解TimeConsume

该注解有一个默认的value属性,value值为方法名或自定义的描述

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TimeConsume {String value() default "方法";
}

2.使用Aspect定义该注解的切面TimeConsumeAspect

定义好注解后,需要对该注解使用的类进行监听,利用Spring框架Aspect实现切面,定义环绕通知,获取到方法的参数、方法名等信息,便于统计所需。对执行方法进行异常捕获,在finally代码块中实现时间统计逻辑,避免方法异常无法统计。代码如下:

@Slf4j
@Component
@Aspect
public class TimeConsumeAspect {/*** 切点定义为注解@annotation(注解类路径)*/@Pointcut("@annotation(com.weiller.demo.common.annotation.TimeConsume)")public void consume(){}@Around("consume()")public  <T> T around(ProceedingJoinPoint pjp) throws Throwable {Long startTime = System.currentTimeMillis();Object[] args = pjp.getArgs();T result;Method methodClass;try {result = (T)pjp.proceed(args);//执行方法}finally {long endTime = System.currentTimeMillis();Signature signature = pjp.getSignature();String methodName = signature.getName();Class<?> targetClass = pjp.getTarget().getClass();Class[] parameterTypes = ((MethodSignature) pjp.getSignature()).getParameterTypes();methodClass = targetClass.getMethod(methodName, parameterTypes);Annotation[] annotations = methodClass.getAnnotations();for (Annotation annotation : annotations){Class<? extends Annotation> aClass = annotation.annotationType();String simpleName = aClass.getSimpleName();if("TimeConsume".equals(simpleName)){TimeConsume timeConsume = (TimeConsume) annotation;String value = timeConsume.value();log.info(value+"[{}] 执行耗时:{}ms",methodName,endTime-startTime);break;}}}return result;}
}

3.测试目标方法中使用

@RestController
@RequestMapping("/test")
public class testController {@TimeConsume("测试")@GetMapping("info")public Object testInfo(){Object parse = JSONObject.parse("{\n" +"\t\t\"requestId\":\"\",\n" +"\t\t\"appId\":\"\",\n" +"\t\t\"nonce\":\"\",\n" +"\t\t\"timestamp\":12345676543,\n" +"\t\t\"signature\":\"\",\n" +"\t\t\"sjgsd\":\"61000\",\n" +"\t\t\"starTime\":12345676543\n" +"\t}");try {Thread.sleep(new Random().nextInt(100));//随机时间休眠} catch (InterruptedException e) {e.printStackTrace();}return parse ;}
}

利用自定义注解,统计方法执行时间相关推荐

  1. 利用自定义注解实现权限验证

    思路: 根据自定义注解,给对应权限能够查看到的资源的Controller方法上添加注解(也就是一个权限字符串),权限字符串跟方法是一对多的关系,同一个权限字符串可以添加到多个方法上:当用户有对应的权限 ...

  2. ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存

    基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...

  3. Java通过自定义注解执行方法_Java自定义注解(使用篇)

    TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...

  4. 如何利用自定义注解放行 Spring Security 项目的接口

    在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求.但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优 ...

  5. SpringBoot中利用自定义注解优雅地实现隐私数据脱敏(加密显示)

    前言 这两天在整改等保测出的问题,里面有一个"用户信息泄露"的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏. 数据脱敏:把系统里的一些敏感数据 ...

  6. 利用AOP实现对方法执行时间的统计

    由于项目主管提出统计每个方法执行的具体时间,打印到日志以后方便分析问题.这个也是很常用的办法,但是我们调用的外部模块非常多,每个地方都加上一个时间统计就显得非常难看了.所以这个事情当然还是交给spri ...

  7. python3函数重载_9.20 利用函数注解实现方法重载

    问题 你已经学过怎样使用函数参数注解,那么你可能会想利用它来实现基于类型的方法重载.但是你不确定应该怎样去实现(或者到底行得通不). 解决方案 本小节的技术是基于一个简单的技术,那就是Python允许 ...

  8. java 扫描自定义注解_利用spring 自定义注解扫描 找出使用自定义注解的类

    我们常常有扫描项目里带有指定注解的class, 下面是利用spring扫描自定义注解的方法, 还是比较灵活的 我这里将扫描到的class放到map, 你可以放到其他地方,以便后期使用 import l ...

  9. 干货,springboot自定义注解实现分布式锁详解

    背景 在互联网的很多场景下,会产生资源竞争,如果是单机环境,简单加个锁就能解决问题:但是在集群环境下(分布式环境),多个客户端在一个很短的时间内竞争同一服务端资源(如抢购场景),或者同一客户端重复提交 ...

  10. springboot记录用户访问次数_SpringBoot中自定义注解实现控制器访问次数限制示例...

    今天给大伙介绍一下SpringBoot中如何自定义注解实现控制器访问次数限制. 在Web中最经常发生的就是利用恶性URL访问刷爆服务器之类的攻击,今天我就给大伙介绍一下如何利用自定义注解实现这类攻击的 ...

最新文章

  1. linux6.2下安装oracle11g,Oracle Linux6.2下安装Oracle11gR2.docx
  2. fatal: unable to access ‘‘: TCP connection reset by peer
  3. 浏览器模式用户代理字符串(IE)
  4. 逻辑备库之ORA-01403解决方法
  5. java并发编程核心方法与框架_Java并发编程核心方法与框架-Future和Callable的使用...
  6. mysql5.7 索引
  7. 正则表达式学习笔记005--脱字符和美元符的认识与应用
  8. python怎么导入sql数据库_如何用Python3写一段将Excel数据导入SQL数据库?
  9. java实现马尔科夫链_马尔科夫链 Markov Chains(示例代码)
  10. dell服务器重装win10,戴尔dell重装win10系统后无法引导的解决方法(原创)
  11. mac上如何安装夜神模拟器
  12. Android最全的屏幕适配
  13. 什么是拼多多通用券|盛天海科技
  14. git cherry-pick 多分支的代码库,将代码从一个分支转移到另一个分支
  15. 智能机器人与智能系统(大连理工大学庄严教授)——3.工业机器人
  16. Event Sourcing 和 CQRS
  17. 基于Modelsim的verilog语言设计AES加密解密(硬件电路HDL)
  18. iOS 两套自动打包脚本
  19. Java实现 LeetCode 754 到达终点数字(暴力+反向)
  20. Java:图形界面实现桌面数字时钟

热门文章

  1. Hidistro 易分销2.0 源码带注释非反编译源码真正完整版本
  2. 微信小程序-各种跳转
  3. android 应用引导用户去应用市场评论
  4. 2017年迪培思昆明国际广告标识及LED照明展会刊(参展商名录)
  5. aec一pc_什么是AEC声学回声消除器?
  6. Jquery实现城市选择(省市联动)
  7. Java开发从零开始!java游戏服务器开发教程
  8. 英文论文发表必备干货!SCI投稿7个阶段经典邮件模板,请拿走
  9. 在Linux中连接和使用云存储的三种途径
  10. oracle 结果百分比,Oracle 百分比