利用Spring AOP记录方法的执行时间

网友投稿 295 2023-07-05


利用Spring AOP记录方法的执行时间

一、前言

对于spring aop这个我就不多介绍了,网上一搜一大把,使用过spring的人都知道spring的ioc和aop。ioc我们常用,但在我们自己的系统中,aop的使用几乎为零,除了这个监控的小功能应用到了,其他的基本上没有使用到。下面就给大家整理下利用Spring AOP记录方法执行时间的解决方案,有需要的一起看看吧。

二、解决方案

1、传统方法

最简单、粗暴的方法是给各个需要统计的方法开始和结尾处加的时间戳,然后差值计算结果即可,代码如下:

long startTime = System.currentTimeMillis();

// 业务代码

long endTime = System.currentTimeMillis();

System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间

这样的方式需要给很多统计方法都加上耗时时间的代码,这些代码与核心业务无关却大量重复、分散在各处,维护起来也困难。

2、面向切面编程的方法

所以,不推荐使用上面坏味道的代码。想了很久,打算利用Spring AOP的思想来完成这个功能,话不多说代码和相关的解释如下:

import org.apaBPCBpMche.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.aspectj.lang.ProceedBPCBpMingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.reflect.MethodSignature;

import org.springframework.stereotype.Component;

/**

* 检测方法执行耗时的spring切面类

* 使用@Aspect注解的类,Spring将会把它当作一个特殊的Bean(一个切面),也就是不对这个类本身进行动态代理

* @author blinkfox

* @date 2016-07-04

*/

@Aspect

@Component

public class TimeInterceptor {

private static Log logger = LogFactory.getLog(TimeInterceptor.class);

// 一分钟http://,即1000ms

private static final long ONE_MINUTE = 1000;

// service层的统计耗时切面,类型必须为final StringBPCBpM类型的,注解里要使用的变量只能是静态常量类型的

public static final String POINT = "execution (* com.blinkfox.test.service.impl.*.*(..))";

/**

* 统计方法执行耗时Around环绕通知

* @param joinPoint

* @return

*/

@Around(POINT)

public Object timeAround(ProceedingJoinPoint joinPoint) {

// 定义返回对象、得到方法需要的参数

Object obj = null;

Object[] args = joinPoint.getArgs();

long startTime = System.currentTimeMillis();

try {

obj = joinPoint.proceed(args);

} catch (Throwable e) {

logger.error("统计某方法执行耗时环绕通知出错", e);

}

// 获取执行的方法名

long endTime = System.currentTimeMillis();

MethodSignature signature = (MethodSignature) joinPoint.getSignature();

String methodName = signature.getDeclaringTypeName() + "." + signature.getName();

// 打印耗时的信息

this.printExecTime(methodName, startTime, endTime);

return obj;

}

/**

* 打印方法执行耗时的信息,如果超过了一定的时间,才打印

* @param methodName

* @param startTime

* @param endTime

*/

private void printExecTime(String methodName, long startTime, long endTime) {

long diffTime = endTime - startTime;

if (diffTime > ONE_MINUTE) {

logger.warn("-----" + methodName + " 方法执行耗时:" + diffTime + " ms");

}

}

}

注意:最后还需要在applicationContext.xml文件中加上AOP需要的配置,这样Spring才能识别到它。

总结

以上就是关于利用Spring AOP记录方法执行时间的全部内容,希望这篇文章的内容对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:第一次动手实现bootstrap table分页效果
下一篇:Java8中字符串处理库strman
相关文章

 发表评论

暂时没有评论,来抢沙发吧~