记录每个方法的执行时间 AOP

package com.aop;import org.apache.log4j.Logger;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;public class MyAspect {private static final Logger LOGGER=Logger.getLogger(MyAspect.class);//输出到指定文件//private static final Logger LOGGER=Logger.getLogger("com.util.TimerLogger");long a=0;public void doBefore(JoinPoint jp) {Object[] o=jp.getArgs();for(int i=0;i<o.length;i++){System.err.println("输入参数为"+o[i]);}a=System.currentTimeMillis();System.err.println("当前方法执行时间为: "+ jp.getTarget().getClass().getName() + "."+ jp.getSignature().getName());}public void doAfter(JoinPoint jp) {System.err.println("方法结束时间为: "+ jp.getTarget().getClass().getName() + "."+ jp.getSignature().getName());System.err.println("\r<br>执行耗时 : "+(System.currentTimeMillis()-a)+" 秒 ");}public Object doAround(ProceedingJoinPoint pjp) throws Throwable {long time = System.currentTimeMillis();Object retVal = pjp.proceed();time = System.currentTimeMillis() – time;Object[] o=pjp.getArgs();for(int i=0;i<o.length;i++){LOGGER.info("第"+(i+1)+"输入参数 = "+o[i]);}LOGGER.info("当前方法为 "+ pjp.getTarget().getClass().getName() + "."+ pjp.getSignature().getName()+" 执行时间为"+time+"ms");return retVal;}public void doThrowing(JoinPoint jp, Throwable ex) {System.out.println("method " + jp.getTarget().getClass().getName()+ "." + jp.getSignature().getName() + " throw exception");System.out.println(ex.getMessage());}}

spring配置文件

<aop:config><aop:aspect id="concurrentOperationRetry" ref="myAspect"><aop:pointcut id="idempotentOperation"expression="execution(* com.service.imp.*.*(..))"/><!–<aop:before pointcut-ref="idempotentOperation" method="doBefore"/><aop:after pointcut-ref="idempotentOperation" method="doAfter"/> –><aop:around pointcut-ref="idempotentOperation" method="doAround"/></aop:aspect></aop:config>测试方法package function;import java.io.IOException;import org.junit.Test;import com.model.User;import com.service.UserService;import com.util.BeanFactoryUtil;public class MyAspectTest {@Testpublic void aopTest() throws IOException{UserService userservice=(UserService)BeanFactoryUtil.getInstance().getBean("userService");User user=userservice.getUserByUid(3);System.err.println(user.getName());}}

控制台输出

[30 14:32:22,192 INFO ] [main] imp.UserServiceImpl – UserServiceImpl中getUserByUid执行结束[30 14:32:22,193 INFO ] [main] aop.MyAspect – 第1输入参数 = 3[30 14:32:22,194 INFO ] [main] aop.MyAspect – 当前方法为 com.service.imp.UserServiceImpl.getUserByUid 执行时间为459ms

配置文件说明

1写切面类。

2定义切入点。pointcut指定切入点

3定义通知。(对目标对象进行增强处理)

常用通知类型:拦截环绕通知 around前置通知 before异常通知 after-throwingmethod后置通知 after

记录com.service.imp.*.*(..))所有方法的执行时间

第一个*记录的是imp包下所有类,第二个*是所有类下的记录所有方法,(..)表示匹配所有的输入参数。

1 目标方法执行前执行切面的around()方法记录当前系统时间为a,

2 执行目标对象方法Object retVal = pjp.proceed();

3 目标方法执行后执行切面的around()方法记录当前系统时间为b

方法执行时间=b-a;

版权声明:本文为博主原创文章,未经博主允许不得转载。

,不会因为别人显赫的成功而促使自己有卓越的进步。

记录每个方法的执行时间 AOP

相关文章:

你感兴趣的文章:

标签云: