Spring Aop 细节详解
@Aspect 注解方法执行
package com.atguigu.spring.aop.impl;
import java.util.Arrays;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
import org.aspectj.lang.JoinPoint;
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.springframework.stereotype.Component;
@Component
@Aspect
public class LoggingAspect {
/**
* joinPoint 包含了代理中的所有方法名和参数名
*/
@Before(value = "execution(public int com.atguigu.spring.struts2.inter.AuthodCaluer.add(int, int))")
public void beforeMethod(JoinPoint joinPoint) {
String methods = joinPoint.getSignature().getName();
Object args[] = joinPoint.getArgs();
System.out.println("原方法中的方法名称是:"+methods);
System.out.println("原方法中的参数是:"+Arrays.asList(args));
System.out.println("The Method begins with methods");
}
/**
* 方法执行完成,无论怎么样都会执行的通知
*/
@After(value = "execution(public int com.atguigu.spring.struts2.inter.AuthodCaluerLogImpl.mul(int, int))")
public void afterMethod() {
System.out.println("The Method ends");
}
/**
* 当方法有返回值就会执行,可获取返回值
*/
@AfterReturning(value = "execution(public int com.atguigu.spring.struts2.inter.AuthodCaluerLogImpl.mul(int, int))",returning="result")
public int afterReturning(Object result) {
System.out.println("result = "+result);
System.out.println("The Method ends");
return 0;
}
/**
* 当方法有异常抛出执行,可以定位异常
*/
@AfterThrowing(value = "execution(public int com.atguigu.spring.struts2.inter.AuthodCaluerLogImpl.div(int, int))",throwing="ex")
public void afterThrowing(Exception ex) {
System.out.println("异常为 : "+ex);
System.out.println("The Method has execption");
}
}
切面执行优先级以及定义pointCut
package com.atguigu.spring.aop.impl;
import java.util.Arrays;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
import org.aspectj.lang.JoinPoint;
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;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 切面的执行优先级,只越小,优先级越高
*/
@Order(1)
@Component
@Aspect
public class ValateAspect {
/**
* 定义切面,达到方法复用,在定义切面的execution的时候,只需要引入 包.类.方法() 即可瞬间定义execution
*/
@Pointcut(value="execution(public int com.atguigu.spring.struts2.inter.AuthodCaluer.add(int, int))")
public void pointCutAspect(){}
/**
* joinPoint 包含了代理中的所有方法名和参数名
*/
@Before(value = "com.atguigu.spring.aop.impl.LoggingAspect.pointCutAspect()")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("验证切面....");
}
}