Spring AOP 实现监控方法执行的时间(统计service中方法执行的时间)

项目中有时候会遇到统计方法执行的时间,来对项目进行优化!下面是我自己在工作中遇到的问题,和我自己的解决方法。要统计出项目中方法执行时间大于1秒的那些方法!我们的项目开发使用的是SpringMVC 那么首先想到使用 Aop Aspet 切面统计,那样子更加方便也高效。1:打开切面!因为项目使用的SpringMVC,项目中的配置文件就配置的 <aop:aspectj-autoproxy …

大家好,又见面了,我是全栈君。

项目中有时候会遇到统计方法执行的时间,来对项目进行优化!下面是我自己在工作中遇到的问题,和我自己的解决方法。

要统计出项目中方法执行时间大于1秒的那些方法!我们的项目开发使用的是SpringMVC 那么首先想到使用 Aop Aspet 切面统计,那样子更加方便也高效。

1:打开切面!因为项目使用的SpringMVC,项目中的配置文件就配置的 <aop:aspectj-autoproxy proxy-target-class=”true”/> ,具体的配置内容如下:

 

<!--自动扫描-->
<context:component-scan base-package="com.dufy">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--打开切面-->
<aop:aspectj-autoproxy proxy-target-class="true"/> 
<!--支持系统能够识别相应的注解-->
<context:annotation-config></context:annotation-config>

2:开发切面类

 

 

package com.aebiz.b2b2c.webinterface.cart.util;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 *  使用Aspect统计方法调用的时间
 * @author dufy
 * @Date 2016-03-02
 * @version 1.0
 *
 */

@Aspect
@Component
public class LoggingAspect {
	//日志记录
	public Logger log = Logger.getLogger("reqTime_logger");
	
	/**
	 * 统计Service中方法调用的时间
	 * @param joinPoint
	 * @throws Throwable
	 */
	@Around("execution(* com.dufy..*Service.*(..))")
	public Object logServiceMethodAccess(ProceedingJoinPoint joinPoint) throws Throwable {
		long start = System.currentTimeMillis();
		Object object = joinPoint.proceed();
		long end = System.currentTimeMillis();
		long t = end - start;
		if(t>=1000){
			String tmp = joinPoint.getSignature().toString();
			log.info(String.format("class:%s,invoke_time:%s",tmp,t));
		}
		return object;
	}
}

3:声明切面类,因为我上面的配置文件中已经进行全局扫描和支持注解类识别了,这里就不需要再配置对应的类的声明了。

 

 

这样子当项目运行起来的时候,就会

com.dufy..*Service.*(..)

 

这个包下所有的Service中的方法。

具体的execution方法下面进行介绍:

 

 

切点函数execution()的使用
      @Around("execution(* *(..))")  : execution()是一个切点函数,* * (..)是该函数的参数,其格式为:
	    <访问权限>? 返回值类型  包名+类名+方法名(参数类型) <throws 异常类型声明>
	@Around("execution(* * (..))") //all
	@Around("execution(public * * (..))")   //绑定方法的访问权限
	@Around("execution(public * * (..) throws RuntimeException)")   //绑定异常类型声明
   	@Around("execution(public * * (..) throws RuntimeException+)")   //+代表当前类及其子类
	@Around("execution(int * (..))")   //绑定方法的返回值
	@Around("execution(Object+ * (..))")   //绑定方法的返回值
	@Around("execution(void save* (..))")   //绑定方法名,以save开头的方法
	@Around("execution(void *m* (..))")   //包含m的方法
	@Around("execution(void com.dufy.spring.service.*.* (..))")   //绑定包名+类名+方法名
	@Around("execution(void com.dufy.spring..*Service*.update* (..))")   //包名以com.sxt.spring开头的类名中包含Service的类中所有以update开关的方法
	@Around("execution(void *())")   //绑定方法的参数
	@Around("execution(void *(String))")   //绑定方法的参数
	@Around("execution(void *(..,String,..))")   //只要有一个String类型的参数即可
	@Around("args(int,String)")   
	@Around("execution(* save*(..)) || execution(* update*(..))")    //切点运算   (||,or,&&,and)
	@Around("execution(* save*(..)) or execution(* update*(..))")    //切点运算   

 

大概就是这些,希望我们举一反三!共同加油!

 

如果在使用的过程中遇到什么问题,欢迎大家可以留言或者通过左侧的联系方式麻烦我,我希望和大家一起成长!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121254.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 此工作站和主域间的信任关系失败原因_主域间的信任关系失败

    此工作站和主域间的信任关系失败原因_主域间的信任关系失败相信用域管理的童鞋都会遇到一个问题:在域账户登录的时候有时会出现“此工作站和主域间信任关系失败”那么遇到这种情况该如何解决的呢?跟我走:拔掉网线,登录系统在用户账户中把administrator账户打开,并设密码插上网线,退域,重启,用administrator账户登录重新加域,刷新策略即可 转载于:https://blog.51cto.com/xkai20/158…

    2022年10月19日
  • having 用法

    having 用法SELECTfee.bank_code,COUNT(1)cFROMt_fp_feefeeWHEREfee.fcd>=DATE’2019-6-13’GROUPBYfee.bank_codeHAVINGCOUNT(1)>=1000注意COUNT(1)不能改为C,不能使用别名…

  • CPU测试_性能测试cpu温度多少范围正常

    CPU测试_性能测试cpu温度多少范围正常目录一系统性能测试指标1.1响应时间1.2并发1.3点击量/点击率1.4吞吐量/吞吐率1.5TPS/QPS1.6PV/UV二Linux服务器性能指标2.1CPU使用率2.2内存占用率2.3系统平均负载2.4磁盘IO2.5linux常用性能命令2.5.1CPU2.5.2内存2.5.3负载2.5.4磁盘2.5.5整体性能测试指标是衡量系统性能的评价标准,常用的系统性能测试指标包括:响应时间…

    2022年10月22日
  • pytorch实现L2和L1正则化regularization的方法

    pytorch实现L2和L1正则化regularization的方法pytorch实现L2和L1正则化的方法目录目录pytorch实现L2和L1正则化的方法1.torch.optim优化器实现L2正则化2.如何判断正则化作用了模型?2.1未加入正则化loss和Accuracy2.1加入正则化loss和Accuracy2.3正则化说明3.自定义正则化的方法3.1自定义正则化Regularization类3.2…

  • 硬盘的存储原理_移动硬盘工作原理

    硬盘的存储原理_移动硬盘工作原理主要记录磁盘的分类、组成等。

  • 浅复制,深复制详解下载_复制时如何跳过一部分内容

    浅复制,深复制详解下载_复制时如何跳过一部分内容文章目录浅复制和深复制String类实现浅复制和深复制有关浅复制与深复制的定义为:对类进行复制的时候按位复制,即把一个对象各数据成员的值原样复制到目标对象中。当类中涉及到指针类型数据成员的时候,往往就会产生指针悬挂问题。看以下结构:class A{ public: int* a;};A a1;A b1=a1;b1=a1执行的是浅复制,此时a1.a和b1….

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号