在接口开发中,我们通常需要统计接口耗时,为后续接口性能做统计。在springMVC中可以用它的aop来记录日志。

  1、在spring配置文件中开启AOP

    <!--*************** 支持aop **************** -->
<aop:aspectj-autoproxy proxy-target-class="true" />

  2、编写AOP

package com.parry.demo.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component; /**
* <p>
* PerformanceInterceptor 性能统计接口:接口耗时统计
* <p>*/
@Aspect
@Component
public class PerformanceInterceptor { private Logger log = Logger.getLogger(PerformanceInterceptor.class); //我需要监控所有controlller的耗时(controller放在包com.parry.demo.controller下面)
@Around("execution(* com.parry.demo.controller.*.*(..))")
public Object logTome(ProceedingJoinPoint pjp) throws Throwable {
long begin = System.currentTimeMillis();
String method = pjp.getSignature().getName();
String className = pjp.getTarget().getClass().getName(); Object ret = pjp.proceed();
log.info("func<doAround> method<" + className + "." + method + "> cost time <"
+ (System.currentTimeMillis() - begin) + ">ms");
return ret;
}
}

  3、测试访问接口

  aaarticlea/png;base64,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" alt="" />

  4、关于AOP的一些说明

  (1)一些常见的切入点

  • execution(public * * (. .))    任意公共方法被执行时,执行切入点函数
  • execution( * set* (. .))   任何以一个“set”开始的方法被执行时,执行切入点函数
  • execution( * com.demo.service.AccountService.* (. .))  当接口AccountService 中的任意方法被执行时,执行切入点函数
  • execution( * com.demo.service.*.* (. .))  当service 包中的任意方法被执行时,执行切入点函数
  • within(com.demo.service.*)  在service 包里的任意连接点
  • within(com.demo.service. .*)  在service 包或子包的任意连接点
  • this(com.demo.service.AccountService) 实现了AccountService 接口的代理对象的任意连接点
  • target(com.demo.service.AccountService) 实现了AccountService 接口的目标对象的任意连接点
  • args(Java.io.Serializable)  任何一个只接受一个参数,且在运行时传入参数实现了 Serializable 接口的连接点

  (2)AOP多样的方法

  • @Before:方法前执行
  • @AfterReturning:运行方法后执行
  • @AfterThrowing:Throw后执行
  • @After:无论方法以何种方式结束,都会执行(类似于finally)
  • @Around:环绕执行

springMVC Aspect AOP 接口耗时统计的更多相关文章

  1. Android Activity启动耗时统计方案

    作者:林基宗 Activity的启动速度是很多开发者关心的问题,当页面跳转耗时过长时,App就会给人一种非常笨重的感觉.在遇到某个页面启动过慢的时候,开发的第一直觉一般是onCreate执行速度太慢了 ...

  2. 给 asp.net core 写个中间件来记录接口耗时

    给 asp.net core 写个中间件来记录接口耗时 Intro 写接口的难免会遇到别人说接口比较慢,到底慢多少,一个接口服务器处理究竟花了多长时间,如果能有具体的数字来记录每个接口耗时多少,别人再 ...

  3. asp.net mvc,基于aop实现的接口访问统计、接口缓存等

    其实asp.net 上aop现有的框架应该蛮多的,比如静态注入式的PostSharp(新版本好像已经商业化了,旧版本又不支持.net4.0+),或者通过反射的(性能会降低). 本文则是通过mvc其中一 ...

  4. springMVC之AOP

    AOP(Aspect-Oriented Programming,面向切面编程) 切面(Aepect):横切关注点(跨越应用程序多个模块的功能)被模块化的对象: 通知(Advice):切面必须要完成的工 ...

  5. awk查看接口耗时情况

    +1:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Ag ...

  6. GPU和CPU耗时统计方法

    GPU端耗时统计 cudaEvent_t start, stop; checkCudaErrors(cudaEventCreate(&start)); checkCudaErrors(cuda ...

  7. 一则sql优化实现接口耗时降低30倍的优化案例

    业务场景: 也测的业务,如上图,通过捕获业务的涉及的接口如下: 查询接口耗时大于7s,已经是非常的慢 经验提示: 一般接口响应时间慢的问题,最简单的方式就是监控接口相关的sql是否存在问题 开启mys ...

  8. Dropwizard+jersey+MDC实现日志跟踪以及接口响应时间统计

    一.实现接口响应时间统计 1.1添加全局请求过滤器并注册 import org.apache.log4j.MDC; import org.slf4j.Logger; import org.slf4j. ...

  9. java aop做一个接口耗时的计算

    看代码: @Aspect @Component public class TimeCostAspect { private static Logger logger = LoggerFactory.g ...

随机推荐

  1. GCD封装的个人理解和应用

    GCD封装的个人理解和应用 特点 >>将GCD封装,使我们从繁琐的方法记忆中解脱出来,能够直接快速的应用. 使用方法 1.将工程中的GCD文件中的9个文件拖入自己的工程中(你自己最好建一个 ...

  2. Mac常用shell命令

    几个常用命令 pwd 命令名称:pwd 英文:print work directory 描述:查看当前工作目录的完整路径 ls 英文全称: list 描述:列出目录下的内容清单 常用参数: -l:列出 ...

  3. Android(Java)控制GPIO的方法及耗时分析

    前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍 ...

  4. iOS源代码管理工具

    源代码管理工具简介 1.为什么会出现源代码管理工具? 为了解决在软件开发过程中,由源代码引发的各种蛋疼.繁琐的问题 2.源代码管理不当可能会引起的后果? 无法后悔:做错了一个操作后,不能回到之前的操作 ...

  5. Nginx反向代理和负载均衡部署指南

    1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本(目前是1.5.13版本)安装包: ...

  6. CLR线程概览(一)

    托管 vs. 原生线程 托管代码在“托管线程”上执行,(托管线程)与操作系统提供的原生线程不同.原生线程是在物理机器上执行的原生代码序列:而托管线程则是在CLR虚拟机上执行的虚拟线程. 正如JIT解释 ...

  7. Oracle数据库shutdown immediate被hang住的几个原因

    实验操作环境:         操作系统:Red Hat Enterprise Linux ES release 4 (Nahant Update 6)                         ...

  8. union和union all用法

    工作中,遇到同事之前写的oracle语句中有一个union all,并且很多地方都用到了.便在网上查了一下用法,以下是自己的理解. union  (联合)将两个或者多个结果集合并. 在使用时,两个结果 ...

  9. Zend Studio安装详解

    本篇文章介绍Zend Stuido安装 PHP安装请参考 http://www.cnblogs.com/azhe-style/p/php_new_env_build.html 一.下载 百度Zend ...

  10. openstack命令备忘录

    原文http://my.oschina.net/u/138210/blog/142661 查看rabbitmq 队列 rabbitmqctl list_queues 查看keystone的用户 key ...