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<Object> 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 中, 切入点表达式可以通过操作符 &&, ||, ! 结合起来.

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

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


后置通知

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

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

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


 

返回通知

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

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

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

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


异常通知

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

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

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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值