1、切入点表达式的写法
切入点表达式:定位连接的方式
execution(public int com.atguigu.aop.annotation.CalculatorImpl.add(int,int))
execution( com.atguigu.aop.annotation.CalculatorImpl.(..))
其中第一个表示任意的访问修饰符和返回值类型
也可以通过表示包下任意的类或类中任意的方法
..表示任意的参数列表
2、通知的类型
a>前置通知:作用于目标对象方法执行之前
@Before(“pointCut()”)
public void beforeMethod(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
String args = Arrays.toString(joinPoint.getArgs());
System.out.println(“Logger—>前置通知,方法名:”+methodName+”,参数:”+args);
}
b>后置通知:作用于目标对象方法执行的finally语句块中
@After(“pointCut()”)
public void afterMethod(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
System.out.println(“Logger—>后置通知,方法名:”+methodName);
}
c>返回通知:作用于目标对象方法的返回值之后
注意:@AfterReturning中的属性returning,用来将通知方法的某个形参,接收目标对象方法的返回值
@AfterReturning(value = “pointCut()”, returning = “result”)
public void afterReturningMethod(JoinPoint joinPoint, Object result){
String methodName = joinPoint.getSignature().getName();
System.out.println(“Logger—>返回通知,方法名:”+methodName+”,结果:”+result);
}
d>异常通知
注意:@AfterThrowing中的属性throwing,用来将通知方法的某个形参,接收目标对象方法的异常
@AfterThrowing(value = “pointCut()”, throwing = “ex”)
public void afterThrowingMethod(JoinPoint joinPoint, Throwable ex){
String methodName = joinPoint.getSignature().getName();
System.out.println(“Logger—>异常通知,方法名:”+methodName+”,异常:”+ex);
}
e>环绕通知
@Around(“pointCut()”)
public Object aroundMethod(ProceedingJoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
String args = Arrays.toString(joinPoint.getArgs());
Object result = null;
try {
System.out.println(“环绕通知—>目标对象方法执行之前”);
//目标对象(连接点)方法的执行
result = joinPoint.proceed();
System.out.println(“环绕通知—>目标对象方法返回值之后”);
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println(“环绕通知—>目标对象方法出现异常时”);
} finally {
System.out.println(“环绕通知—>目标对象方法执行完毕”);
}
return result;
}
3、切入点表达式的重用
通过@PointCut注解标识一个方法,设置公共的切入点表达式
在当前的切面中,就可以通过调用方法的方式访问公共的切入点表达式
@Pointcut(“execution( com.atguigu.aop.annotation.CalculatorImpl.(..))”)
public void pointCut(){}
@Before(“pointCut()”)
public void beforeMethod(){
System.out.println(“Logger—>前置通知”);
}
4、获取连接点的信息
在通知方法的参数位置,设置JointPoint类型的参数,获取连接点相关的信息
//获取连接点所对应的方法的方法名
String methodName = joinPoint.getSignature().getName();
//获取连接点所对应的方法的参数
String args = Arrays.toString(joinPoint.getArgs());
5、切面的优先级
可以通过@Order的注解标识切面类,切面的优先级默认为Integer的最大值
可以通过@Order的value属性设置切面的优先级,值越小优先级越高