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)
上一篇 2022年2月24日 下午8:00
下一篇 2022年2月24日 下午8:00


相关推荐

  • 整合Flume和Kafka完成实时数据采集

    整合Flume和Kafka完成实时数据采集需要注意:参考的网站要与你的kafka的版本一致,因为里面的字段会不一致例如:http://flume.apache.org/releases/content/1.6.0/FlumeUserGuide.html#kafka-sink这是1.6版本的,如果需要查看1.9版本的直接就将1.6.0改为1.9.0即可#avro-memory-kafka.confavro-memory-kafka.sources=avro-sourceavro-memory-kafka.sinks=kafka-.

    2022年6月23日
    36
  • Android实现页面跳转

    Android实现页面跳转一 Android 实现页面跳转有两种方式 一种为 MainActivity 跳转 第二种是 Relatelayout 布局跳转 首先看第一种方式 1 MainActivity 区域设置 publicclassM Overrideprot BundlesavedI super onCreate savedInstanc

    2026年3月18日
    2
  • 当贝官宣首发 OpenClaw 中文版 Molili,支持一键安装部署

    当贝官宣首发 OpenClaw 中文版 Molili,支持一键安装部署

    2026年3月13日
    2
  • 数组splice方法的使用「建议收藏」

    数组splice方法的使用「建议收藏」数组splice方法是通过删除、替换现有元素、添加新的元素来修改数组的!

    2025年12月4日
    4
  • 边车模式

    边车模式边车模式边车 就是在原来二轮摩托车旁边增加一个座位成了三轮摩托车 增加的一部分称为边车边车模式 对现有的服务增加额外的功能 这些功能并不影响业务逻辑 例如增加日志 限流 熔断 服务的注册和服务发现有专门服务来实现 像程序中的控制和业务逻辑分离 Controller 和 Service 层分离 这样大大降低了服务之间的耦合度并提升了扩展性和降低业务的复杂性这也符合单一职责原则 服务就是负载实现好自己的业务逻辑 一些其他的控制功能就交给其他组件来实现

    2026年3月16日
    2
  • Java简历与面试

    Java简历与面试Java 就业指导 想要成为合格的 Java 程序员或工程师到底需要具备哪些专业技能 面试者在面试之前到底需要准备哪些东西呢 本文陈列的这些内容既可以作为个人简历中的内容 也可以作为面试的时候跟面试官聊的东西 你可以把这些内容写到你的简历中 当然更需要的是你在面试的时候向面试官展示这些专业技能 相信此文对正在寻觅 Java 程序员 Java 工程师 职位的 freshman 以及希望成为中高级 Java 开发者的 ju

    2026年3月16日
    2

发表回复

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

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