一、配置文件方式
1、配置applicationContext.xml,
<bean id="logAopBean" class="com.demo.common.aop.LogAop"></bean><aop:config><aop:aspect id="logAspect" ref="logAopBean"><aop:pointcut expression="execution(* com.demo..*(..))" id="allMethod"/><aop:before method="before" pointcut-ref="allMethod" /><aop:after-throwing method="afterThrowing" pointcut-ref="allMethod" /><aop:after-returning method="afterReturn" pointcut-ref="allMethod" /><aop:after method="after" pointcut-ref="allMethod" /></aop:aspect></aop:config>
2、日志处理类,
/*** LogAop.java* * Shanghai NTT DATA Synergy Software Co., Ltd. All Rights Reserved.* @author wyl* @date 2016-10-18*/ package com.demo.common.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;/*** @author wyl* @Description TODO * @date 2016-10-18**/public class LogAop {public void before(JoinPoint call){String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println("开始执行:"+className+"."+methodName+"()方法...");}public void afterThrowing(JoinPoint call){String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println(className+"."+methodName+"()方法抛出了异常...");}public void afterReturn(JoinPoint call){String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println(className+"."+methodName+"()方法正常执行结束...");}public void after(JoinPoint call){String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println(className+"."+methodName+"()最终执行步骤(finally)...");}/*//用来做环绕通知的方法可以第一个参数定义为org.aspectj.lang.ProceedingJoinPoint类型 public Object doAround(ProceedingJoinPoint call) throws Throwable { Object result = null; this.before(call);//相当于前置通知 try { result = call.proceed(); this.afterReturn(call); //相当于后置通知 } catch (Throwable e) { this.afterThrowing(call); //相当于异常抛出后通知 throw e;}finally{ this.after(call); //相当于最终通知 } return result; }*/
}
二、注解方式
1、配置applicationContext.xml,
<bean id="logAspectBean" class="com.demo.common.aop.LogAnnotationAspect"></bean><aop:aspectj-autoproxy/>
2、日志处理类,
/*** LogAnnotationAspect.java* * Shanghai NTT DATA Synergy Software Co., Ltd. All Rights Reserved.* @author wyl* @date 2016-10-18*/ package com.demo.common.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;/*** @author wyl* @Description TODO * @date 2016-10-18**/@Aspect //定义切面类
public class LogAnnotationAspect { @SuppressWarnings("unused") //定义切入点,提供一个方法,这个方法的名字就是改切入点的id @Pointcut("execution(* com.demo..*(..))") private void allMethod(){} //针对指定的切入点表达式选择的切入点应用前置通知 @Before("allMethod()") public void before(JoinPoint call) { String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println("开始执行:"+className+"."+methodName+"()方法...");} //访问命名切入点来应用后置通知 @AfterReturning("allMethod()") public void afterReturn(JoinPoint call) { String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println(className+"."+methodName+"()方法正常执行结束...");} //应用最终通知 @After("allMethod()") public void after(JoinPoint call) { String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println(className+"."+methodName+"()最终执行步骤(finally)...");} //应用异常抛出后通知 @AfterThrowing("allMethod()") public void afterThrowing(JoinPoint call) { String className = call.getTarget().getClass().getName();String methodName = call.getSignature().getName();System.out.println(className+"."+methodName+"()方法抛出了异常...");} //应用周围通知 //@Around("allMethod()") public Object doAround(ProceedingJoinPoint call) throws Throwable{ Object result = null; this.before(call);//相当于前置通知 try { result = call.proceed(); this.afterReturn(call); //相当于后置通知 } catch (Throwable e) { this.afterThrowing(call); //相当于异常抛出后通知 throw e; }finally{ this.after(call); //相当于最终通知 } return result; }
}
希望对你有所帮助!