当前位置: 代码迷 >> 综合 >> Spring AOP切面日志Demo 配置文件方式与注解方式
  详细解决方案

Spring AOP切面日志Demo 配置文件方式与注解方式

热度:68   发布时间:2023-11-02 13:17:45.0

一、配置文件方式

    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;  }  
}

希望对你有所帮助!

  相关解决方案