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*(..))")    //切点运算   

 

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

 

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 从源码角度看JedisPoolConfig参数配置

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!你好,JedisPoolConfigJava中使用Jedis作为连接Redis的工具。在使用Jedis的也可以配置JedisPool连接池,JedisPool配置参数大部分是由JedisPoolConfig的对应项来赋值的。本文简单总结几个常用的配置,然后通过源码(版本jedis-3.1.0)的角度让你理解配置这些…

    2022年2月28日
    63
  • 真封神2.5服务端关于不能转生问题解决办法

    真封神2.5服务端关于不能转生问题解决办法传说很久很久以前从ZFS4放出2.5的服务端以后很多人测试转生不了 因为被ZFS4个鸟人把转生的配置文件删除掉了  害的我曾经还使用反汇编改了一堆代码!伤心!现在我把这个配置文件补上给大家!已经会了的朋友不要藐视本人这里只给不会的人做下提示!更多教程请关注www.zfsyhg.com,感谢大家支持!感谢CSDN的支持!

    2022年7月24日
    11
  • jrtplib java,jrtplib 分包处理

    转载自:http://blog.csdn.net/sxcong/article/details/3736354听说jrtplib写的不错,终于找到时间下来看看。下载,直接用VC6编译,很容易。然后打开VC,建立工程,测试examples下那几个收发程序,的确用起来很简单。想想以前都是自己封装UDP,现在的程序员真幸福。不过,在发送视频数据时出了问题,跟踪进去看了一下,里面设置最大帧数据长度为140…

    2022年4月17日
    47
  • DLL文件反编译(附:工具下载链接)

    DLL文件反编译(附:工具下载链接)前几天写程序的时候电脑突然坏了,代码没有提交,已经更新过了,也就是说写的东西,除了DLL文件之外没别的东西了,代码全都没了,突然灵光一闪,想到了反编译。说干就干。百度上搜了下反编译工具,发现一款名叫“Reflector”的歪果反编译文件的效果不错,接下来,下载,为了方便大家,我直接放在百度云里面了:链接:https://pan.baidu.com/s/1PfxKxKp57pTYnSR3ThlOIg提取码:ohx2复制这段内容后打开百度网盘手机App,操作更方便哦下载下来之后,解压完是这样的:

    2025年7月4日
    28
  • Git常用命令

    Git常用命令Git常用命令

    2022年4月23日
    46
  • mykit-db-sync之——数据库同步工具正式开源[通俗易懂]

    mykit-db-sync之——数据库同步工具正式开源[通俗易懂]转载请注明出处:https://blog.csdn.net/l1028386804/article/details/82731142重磅消息:数据库同步工具mykit-db-sync正式开源开源地址:https://github.com/sunshinelyz/mykit-db-sync框架简述mykit中分离出的强大的数据库同步工具——mykit-db-sync基于java开发…

    2022年6月16日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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