package com.stu; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; public class Log { //定义方法开始时间和结束时间 long startTime; long afterTime; public void start() { //获取系统当前时间的毫秒数 startTime = System.currentTimeMillis(); System.out.println( "前置通知before" ); } // JoinPoint:连接点对象 public void after(JoinPoint jp) { System.out.println( "最终通知after" ); afterTime = System.currentTimeMillis(); Signature signature = jp.getSignature(); System.out.println(signature.getDeclaringTypeName()+ "." +signature.getName()+ "方法执行了" +(afterTime-startTime)+ "ms" ); } public void afterReturning() { System.out.println( "后置通知afterReturning" ); } public void afterThrowing(JoinPoint jp,Exception e) throws Exception { System.out.println( "异常通知afterThrowing" ); System.out.println( "发生异常,异常的原因是" + e.getMessage()); } /** * ProceedingJoinPoint:正在执行的连接点,只能写在环绕通知中 * * @return返回值表示的连接点的返回值 */ public Object around(ProceedingJoinPoint pjp) { Object obj = null ; System.out.println( "环绕通知around" ); try { System.out.println( "环绕前置通知" ); startTime = System.currentTimeMillis(); // proceed():执行连接点,返回连接点的返回值 // 获取正在执行的连接点对象所在的类,打印结果:class org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint Class<? extends ProceedingJoinPoint> class1 = pjp.getClass(); //System.out.println("class:" + class1); // 当前执行的连接点,打印结果:int com.stu.impl.StuImpl.update(int,int) Signature signature = pjp.getSignature(); //System.out.println("signature:" + signature); // 连接点的方法名,打印结果:update String name = signature.getName(); //System.out.println("name:" + name); // 连接点所在的类,打印结果:class com.stu.impl.StuImpl Class declaringType = signature.getDeclaringType(); //System.out.println("declaringType:" + declaringType); // 连接点所在的类名全路径,打印结果:com.stu.impl.StuImpl String declaringTypeName = signature.getDeclaringTypeName(); //System.out.println("declaringTypeName:" + declaringTypeName); // 调用连接点的目标对象,打印结果:com.stu.impl.StuImpl@6e4784bc Object target = pjp.getTarget(); //System.out.println("target:" + target); // 连接点传递的参数列表 Object[] args = pjp.getArgs(); System.out.println( "args.length:" + args.length); for (Object o : args) {<br> System.out.println( "arg:" +o);<br> } obj = pjp.proceed(); System.out.println( "环绕后置通知" ); } catch (Throwable e) { System.out.println( "环绕异常通知" ); Signature signature = pjp.getSignature(); System.out.println(signature.getDeclaringTypeName()+ "." +signature.getName()+ "方法时发生异常,异常的原因是" + e.getMessage()); } finally { System.out.println( "环绕最终通知" ); afterTime = System.currentTimeMillis(); Signature signature = pjp.getSignature(); System.out.println(signature.getDeclaringTypeName()+ "." +signature.getName()+ "方法执行了" +(afterTime-startTime)+ "ms" ); } return obj; } } |