利用自定义注解,统计方法执行时间
项目中需要统计某些方法的执行时间,最简易的方式是方法执行前记录时间戳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 ;}
}
利用自定义注解,统计方法执行时间相关推荐
- 利用自定义注解实现权限验证
思路: 根据自定义注解,给对应权限能够查看到的资源的Controller方法上添加注解(也就是一个权限字符串),权限字符串跟方法是一对多的关系,同一个权限字符串可以添加到多个方法上:当用户有对应的权限 ...
- ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存
基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...
- Java通过自定义注解执行方法_Java自定义注解(使用篇)
TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...
- 如何利用自定义注解放行 Spring Security 项目的接口
在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求.但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优 ...
- SpringBoot中利用自定义注解优雅地实现隐私数据脱敏(加密显示)
前言 这两天在整改等保测出的问题,里面有一个"用户信息泄露"的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏. 数据脱敏:把系统里的一些敏感数据 ...
- 利用AOP实现对方法执行时间的统计
由于项目主管提出统计每个方法执行的具体时间,打印到日志以后方便分析问题.这个也是很常用的办法,但是我们调用的外部模块非常多,每个地方都加上一个时间统计就显得非常难看了.所以这个事情当然还是交给spri ...
- python3函数重载_9.20 利用函数注解实现方法重载
问题 你已经学过怎样使用函数参数注解,那么你可能会想利用它来实现基于类型的方法重载.但是你不确定应该怎样去实现(或者到底行得通不). 解决方案 本小节的技术是基于一个简单的技术,那就是Python允许 ...
- java 扫描自定义注解_利用spring 自定义注解扫描 找出使用自定义注解的类
我们常常有扫描项目里带有指定注解的class, 下面是利用spring扫描自定义注解的方法, 还是比较灵活的 我这里将扫描到的class放到map, 你可以放到其他地方,以便后期使用 import l ...
- 干货,springboot自定义注解实现分布式锁详解
背景 在互联网的很多场景下,会产生资源竞争,如果是单机环境,简单加个锁就能解决问题:但是在集群环境下(分布式环境),多个客户端在一个很短的时间内竞争同一服务端资源(如抢购场景),或者同一客户端重复提交 ...
- springboot记录用户访问次数_SpringBoot中自定义注解实现控制器访问次数限制示例...
今天给大伙介绍一下SpringBoot中如何自定义注解实现控制器访问次数限制. 在Web中最经常发生的就是利用恶性URL访问刷爆服务器之类的攻击,今天我就给大伙介绍一下如何利用自定义注解实现这类攻击的 ...
最新文章
- linux6.2下安装oracle11g,Oracle Linux6.2下安装Oracle11gR2.docx
- fatal: unable to access ‘‘: TCP connection reset by peer
- 浏览器模式用户代理字符串(IE)
- 逻辑备库之ORA-01403解决方法
- java并发编程核心方法与框架_Java并发编程核心方法与框架-Future和Callable的使用...
- mysql5.7 索引
- 正则表达式学习笔记005--脱字符和美元符的认识与应用
- python怎么导入sql数据库_如何用Python3写一段将Excel数据导入SQL数据库?
- java实现马尔科夫链_马尔科夫链 Markov Chains(示例代码)
- dell服务器重装win10,戴尔dell重装win10系统后无法引导的解决方法(原创)
- mac上如何安装夜神模拟器
- Android最全的屏幕适配
- 什么是拼多多通用券|盛天海科技
- git cherry-pick 多分支的代码库,将代码从一个分支转移到另一个分支
- 智能机器人与智能系统(大连理工大学庄严教授)——3.工业机器人
- Event Sourcing 和 CQRS
- 基于Modelsim的verilog语言设计AES加密解密(硬件电路HDL)
- iOS 两套自动打包脚本
- Java实现 LeetCode 754 到达终点数字(暴力+反向)
- Java:图形界面实现桌面数字时钟