•前置通知:在方法执行之前执行的通知
•前置通知使用 @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
@Aspect:标识这个类是一个切面
@Before标识这个方法是一个前置通知
•最典型的切入点表达式时根据方法的签名来匹配各种方法:
–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 是所有错误和异常类的超类. 所以在异常通知方法可以捕获到任何错误和异常.
•如果只对某种特殊的异常类型感兴趣, 可以将参数声明为其他异常的参数类型. 然后通知就只在抛出这个类型及其子类的异常时才被执行.