aop的before和after,寻思分别在两个方法里获得当前时间,最后一减就可以了。

因此,今天就探讨了一下这个问题,和大家分享一下。

创建maven工程,引入spring的依赖包,配置好applicationContext-aop.xml,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
">

<!-- 切面所在的类包路径 -->
<context:component-scan base-package="com.product" />
<!-- 启动该切面代理 -->
<!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->

</beans>

然后,创建两个包,一个来放切面类,一个放测试类。

测试类如下

package com.product.service;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Service
public class TimeTest {

public void testMethod(){
System.out.println("执行方法");
}

public void testMethod2(){
int sum = 0;
for(int i=0;i<1000;i++){
sum += i;
}
System.out.println(sum);
System.out.println("执行方法2");
}

@SuppressWarnings("resource")
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext-aop.xml");
TimeTest A = (TimeTest)ctx.getBean("timeTest");
A.testMethod();
//A.testMethod2();
ctx.destroy();
}

}

写这个切面类。

package com.product.test.aopTest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MethodTimeMonitor {

private long startTime;

//声明切面类路径,类型必须为final String类型的,注解里要使用的变量只能是静态常量类型的
//public static final String POINT = "execution(* com.product.service.*.*(..))";
//也可以使用注解声明切入点,如下
@Pointcut("execution(* com.product.service.*.*(..))")
public void point(){}

@Before("point()")
public void doBefore(){
this.startTime = System.currentTimeMillis();
}

@After("point()")
public void doAfter(){
long endTime = System.currentTimeMillis();
System.out.println("方法执行了"+(endTime-this.startTime)+"ms");
}

}
现在,运行测试类,ok,看到如下结果:

说明次思路可行。

只是,当面试官继续问我before和after是写在两个方法中,那变量怎么能互通的时候,我竟然忘了它们本来就在一个类里,只需要把起始时间设为成员变量就好了,支吾了半天没答上来。

之后,笔者看了些资料,发现还有其他思路,比如aroud。

此思路和之前的没太大改变,只是在MethodTimeMonitor里,注掉之前的方法,新增around方法,如下:

@Around("point()")
public Object doAround(ProceedingJoinPoint pjp){
long startTime = System.currentTimeMillis();
Object obj = null;
try {
obj = pjp.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long endTime = System.currentTimeMillis();

MethodSignature signature = (MethodSignature) pjp.getSignature();
String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
System.out.println(methodName+"方法执行了"+(endTime-startTime)+"ms");
return obj;
}

好了,再次运行测试类,发现还是能得到一样的结果。

此外,笔者还了解到,aspect可以通过配置的方式实现,详见http://calatustela.iteye.com/blog/1910025。

另外,要提醒大家的是,注意:

1.配置文件尽可能放在src下,引入时直接加classpath就可以了。

2.<context:annotation-config />的作用是为使用到的注解自动配置对应的AnnotationBeanPostProcessor。而当使用自动扫描<context:component-scan 
base-package="com.product.service" />后,它兼具有上述功能,因此两者取一即可。
此外,注意使用了spring注解的类包都要包括在内,否则可能某些包没有扫描,出现意外结果。
3.spring的注解bean加载机制中,获取某个bean用context.getBean("className");不过注意,className是该类首字母小写后的类名。若要自定义,可在注解后声明,如
@Controller("Name")。详见http://blog.csdn.net/damon834274634/article/details/38725909。
---------------------

转自:https://blog.csdn.net/baidu_41722481/article/details/79379040

springAOP实现方法运行时间统计的更多相关文章

  1. Python实现__metaclass__实现方法运行时间统计

    几天前写的,参考了园友的一篇文章,链接找不到了.先感谢,找到了链接再补上.

  2. java监测方法运行时间/效率方法

    前言: 这周在写一个小项目,虽然小但是是纯调外部接口的,调完了接口还不停的循环接口返回的数据(已转换JSONArray),然后再判断值,再做不同处理,关键是数据量还比较大,这刚做完还没开始上线,测试也 ...

  3. spring3.0框架检测方法运行时间测试(转)

    主要利用了Spring AOP 技术,对想要统计的方法进行横切处理,方法执行前开始计时,方法执行后停止计时,得到计时方法就是该方法本次消耗时间. 步骤: 首先编写自己的Interceptor类来实现M ...

  4. 字典get方法和setdesault方法,统计message中各元素的出现频次

    message= 'There are moments in life when you miss someone so much that you just want to pick them fr ...

  5. 统计方法运行时间【Java实现】

    接口Command:定义命令的执行操作 package common; public interface Command { // 运行方法 void run(); } CommandRuntime ...

  6. java线程一之创建线程、线程池以及多线程运行时间统计

    线程和进程的基本概念 进程和线程是动态的概念.         进程是 "执行中的程序",是一个动词,而程序是一个名词,进程运行中程序的"代码",而且还有自己的 ...

  7. 使用SpringAop 验证方法参数是否合法

    (原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7683194) 1.依赖包    aspectjweaver.jar 其中Maven的配 ...

  8. [Done]Spring @Pointcut 切点调用不到(SpringAOP嵌套方法不起作用) 注意事项

    今天在开发过程中,遇到一个问题卡了很久,测试代码如下: package spring.pointcut; import org.aspectj.lang.ProceedingJoinPoint; im ...

  9. 通过日志过滤的方法,统计每天内容详情页面的PV数

    1.目的: 每天凌晨0点1分统计用户点击进入内容详情页的次数,对内容点击量形成榜单. 2.分析: A./data/log/epg.access.log日志实时打印用户访问页面的日志,并且每天凌晨0点会 ...

随机推荐

  1. code4511 信息传递

    寻找最小环 #include <cstdio> #include <cstring> #include <iostream> using namespace std ...

  2. Use formatter to format your JAVA code

    In order to make the codes looks unified and make it easy to understand, it's better to use the same ...

  3. Docker 实现的 redis 主从

    计划用 Docker 实现 Redis 的主从,简单主从而已.主的名称叫 redis-master 一步步来. 先新建个Dockerfile ,从alpine 开始,比较简单. FROM alpine ...

  4. AngularJS基本使用

    简介 AngularJS是Google开源的前端JS结构化框架 Angular关注的是动态展示页面数据, 并与用户进行交互.其主体不再是DOM,而是页面中的动态数据 AngularJS特性(优点) 双 ...

  5. sql语句表连接

    "Persons" 表: Id_P LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush ...

  6. [GO]接口的转换

    package main import "fmt" type Humaner interface { //子集 SayHi() } type Personer interface ...

  7. Introduction mybatis

    项目地址 https://github.com/mybatis/mybatis-3 英文官网 http://mybatis.github.io/mybatis-3/ 中文官网 http://mybat ...

  8. 支持stl容器的gdb自定义命令

    # 本文可以从https://sourceware.org/ml/gdb/2008-02/msg00064/stl-views.gdb直接下载 # 有关gdb的高级使用,请浏览:http://blog ...

  9. sql五大类中的 DTL 数据事务语言

    DTL,数据事务语言 事务的定义:就是指一组相关的SQL操作,我们所有的操作都是事务中的. 注意:在数据库中,执行业务的基本单位是[事务],不是以某一条SQL.    数据库在默认情况下,事务是都打开 ...

  10. 玄虚出品Delphi教程的前言 good

    VCL是基于系统的,根本在于系统API,FMX是基于绘图的,根本在于渲染引擎  VCL的发展受制于系统,(你在VCL的代码里面可以看到Borland对M$的妥协),而FMX的发展仅仅受制于硬件 VCL ...