在接口开发中,我们通常需要统计接口耗时,为后续接口性能做统计。在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. 自定义加载loading view动画组件的使用。

    在github上找的一个有点酷炫的loading动画https://github.com/Fichardu/CircleProgress 我写写使用步骤 自定义view(CircleProgress  ...

  2. plist的读取和写入

    // 从plist中读取数组数据 let arrPath = Bundle.main.path(forResource: "ArrayPList", ofType: "p ...

  3. 错误提示,解决方案java.lang.UnsatisfiedLinkError: Couldn't load easemobservice from loader dalvik.system.PathClassLoad

    解决方案: 在libs下面创建一个armeabi-v7a文件夹 把armeabi *.so的文件复制一份 放在armeabi-v7a运行测试通过 关于 armeabi和armeabi-v7a 区别如下 ...

  4. 将UIview描画成虚线等.

    - (UIView *)lineView{ if (!_lineView) { _lineView = [UIView new]; // _lineView.backgroundColor = UIC ...

  5. Django框架使用一 基本介绍,安装和建项篇

    Django概述 Django 是在快节奏的编辑环境中开发的,设计使得常见 Web 开发任务快速且容易;它可以编写一个数据驱动的Web应用程序,简单的说就是不需要开发者操作数据库. 设计数据模型 尽管 ...

  6. fragment 监听返回

    @Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getVie ...

  7. IE10 和 Chrome50 对日期 new Date() 支持的区别

    IE10 和 Chrome50 对日期 new Date() 支持的区别: new Date('2016-06-18'); // IE10 不通过.Chrome 通过 new Date('2016/0 ...

  8. HADOOP安装指南-Ubuntu15.10和hadoop2.7.2

    Ubuntu15.10中安装hadoop2.7.2安装手册 太初 目录 1.      Hadoop单点模式... 2 1.1        安装步骤... 2 0.环境和版本... 2 1.在ubu ...

  9. 阿里云centos安装svn和submin

    概述 没有找到可以让团队方便使用的云盘,暂时搭建一个svn凑合用一下 svn有三种安装方式 安装方式 服务程序 服务协议 用户和密码 授权 系统配置 svn独立安装 svnserve svn pass ...

  10. [转]17个新手常见Python运行时错误

    原址:http://www.oschina.net/question/89964_62779?p=1 当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的 ...