Spring AOP 前置通知、后置通知、返回通知和异常通知

前置通知

•前置通知:在方法执行之前执行的通知

•前置通知使用 @Before 注解, 并将切入点表达式的值作为注解值.

@Aspect
@Component
public class LoggingAspect {
	//声明该方法是一个前置通知,在目标方法开始之前执行
	@Before("execution(public int com.qiqi.spring.aop.impl.ArithmeticCalculator.*(int, int))")
	private void beforeMethod(JoinPoint joinPoint) {
		// TODO Auto-generated method stub
		String methodName = joinPoint.getSignature().getName();
		List args = Arrays.asList(joinPoint.getArgs());
		System.out.println("the method" + methodName + "begins with" + args);
	}

} 
  

@Aspect:标识这个类是一个切面

@Before标识这个方法是一个前置通知

利用方法签名编写 AspectJ 切入点表达式

•最典型的切入点表达式时根据方法的签名来匹配各种方法:

–execution * com.atguigu.spring.ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中声明的所有方法,第一个 * 代表任意修饰符及任意返回值. 第二个 * 代表任意方法. .. 匹配任意数量的参数. 若目标类与接口与该切面在同一个包中, 可以省略包名.

–execution public * ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 接口的所有公有方法.

–execution public double ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中返回 double 类型数值的方法

–execution public double ArithmeticCalculator.*(double, ..): 匹配第一个参数为 double 类型的方法, .. 匹配任意数量任意类型的参数

–execution public double ArithmeticCalculator.*(double, double): 匹配参数类型为 double, double 类型的

合并切入点表达式

•在 AspectJ 中, 切入点表达式可以通过操作符 &&, ||, ! 结合起来.

Spring AOP 前置通知、后置通知、返回通知和异常通知_第1张图片

让通知访问当前连接点的细节

•可以在通知方法中声明一个类型为 JoinPoint 的参数. 然后就能访问链接细节. 如方法名称和参数值.

Spring AOP 前置通知、后置通知、返回通知和异常通知_第2张图片


后置通知

•后置通知是在目标方法执行后(无论是否发生异常),执行的通知

•一个切面可以包括一个或者多个通知.

•在后置通知中还不能访问目标方法执行的结果

Spring AOP 前置通知、后置通知、返回通知和异常通知_第3张图片


 

返回通知

无论连接点是正常返回还是抛出异常, 后置通知都会执行. 如果只想在连接点返回的时候记录日志, 应使用返回通知代替后置通知.

Spring AOP 前置通知、后置通知、返回通知和异常通知_第4张图片

•在返回通知中, 只要将 returning 属性添加到 @AfterReturning 注解中, 就可以访问连接点的返回值. 该属性的值即为用来传入返回值的参数名称.

•必须在通知方法的签名中添加一个同名参数. 在运行时, Spring AOP 会通过这个参数传递返回值.

原始的切点表达式需要出现在 pointcut 属性中

Spring AOP 前置通知、后置通知、返回通知和异常通知_第5张图片


异常通知

•只在连接点抛出异常时才执行异常通知

将 throwing 属性添加到 @AfterThrowing 注解中, 也可以访问连接点抛出的异常. Throwable 是所有错误和异常类的超类. 所以在异常通知方法可以捕获到任何错误和异常.

如果只对某种特殊的异常类型感兴趣, 可以将参数声明为其他异常的参数类型. 然后通知就只在抛出这个类型及其子类的异常时才被执行.

Spring AOP 前置通知、后置通知、返回通知和异常通知_第6张图片

 

你可能感兴趣的:(Spring)