spring boot aop 记录方法执行时间代码示例
本文研究的主要是springbootaop记录方法执行时间的实现代码,具体如下。
为了性能调优,需要先统计出来每个方法的执行时间,直接在方法前后log输出太麻烦,可以用AOP来加入时间统计
添加依赖
org.springframework.boot spring-boot-starter-aop
在application.properties中加入配置
spring.aop.auto=true
spring.aop.auto属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy。切记千万不要加入多余的信息,如@EnableAspectJAutoProxy!
实现具体代码
@Component @Aspect publicclassLogAspect{ privatestaticfinalLogLOG=LogFactory.getLog(LogAspect.class); /** *定义一个切入点. *解释下: * *~第一个*代表任意修饰符及任意返回值. *~第二个*定义在web包或者子包 *~第三个*任意方法 *~..匹配任意数量的参数. */ @Pointcut("execution(*com.wedo.stream.service..*.*(..))") publicvoidlogPointcut(){ } @org.aspectj.lang.annotation.Around("logPointcut()") publicObjectdoAround(ProceedingJoinPointjoinPoint)throwsThrowable{ // LOG.debug("logPointcut"+joinPoint+"\t"); longstart=System.currentTimeMillis(); try{ Objectresult=joinPoint.proceed(); longend=System.currentTimeMillis(); LOG.error("+++++around"+joinPoint+"\tUsetime: "+(end-start)+"ms!"); returnresult; } catch(Throwablee){ longend=System.currentTimeMillis(); LOG.error("+++++around"+joinPoint+"\tUsetime: "+(end-start)+"mswithexception:"+e.getMessage()); throwe; } } }
注意问题
aop后方法不能正确返回值
这个代理方法一定要返回值,否则,在代码中就没有返回值了。
//这样是不对的 publicvoiddoAround(ProceedingJoinPointjoinPoint){}
Spring的文档中这么写的:SpringAOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。如果被代理的目标实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。
默认是JDK动态代理,更改为cglib
总结
以上就是本文关于springbootaop记录方法执行时间代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。