利用Spring AOP记录方法的执行时间
程序员文章站
2024-03-12 18:31:32
一、前言
对于spring aop这个我就不多介绍了,网上一搜一大把,使用过spring的人都知道spring的ioc和aop。ioc我们常用,但在我们自己的系统中,ao...
一、前言
对于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.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import org.aspectj.lang.proceedingjoinpoint; 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); // 一分钟,即1000ms private static final long one_minute = 1000; // service层的统计耗时切面,类型必须为final string类型的,注解里要使用的变量只能是静态常量类型的 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需要的配置<aop:aspectj-autoproxy/>
,这样spring才能识别到它。
总结
以上就是关于利用spring aop记录方法执行时间的全部内容,希望这篇文章的内容对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读
-
利用Spring AOP记录方法的执行时间
-
Spring Boot中利用JavaMailSender发送邮件的方法示例(附源码)
-
java基于spring注解AOP的异常处理的方法
-
Spring Boot中利用JavaMailSender发送邮件的方法示例(附源码)
-
java基于spring注解AOP的异常处理的方法
-
Spring cloud踩坑记录之使用feignclient远程调用服务404的方法
-
Spring Boot使用AOP实现REST接口简易灵活的安全认证的方法
-
利用Spring Social轻松搞定微信授权登录的方法示例
-
使用Spring MVC拦截器实现日志记录的方法
-
利用Spring Social轻松搞定微信授权登录的方法示例