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 {
@Test
public 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;