Spring - Aspect优先级与切面表达式

时间:2022-03-30 18:59:20

【1】Aspect优先级

  • 在同一个连接点上应用不止一个切面时, 除非明确指定, 否则它们的优先级是不确定的.

  • 切面的优先级可以通过实现 Ordered 接口或利用 @Order 注解指定.

      • 实现 Ordered 接口, getOrder() 方法的返回值越小, 优先级越高.
      • 若使用 @Order 注解, 序号出现在注解中

【2】重用切入点定义

  • 在编写 AspectJ 切面时, 可以直接在通知注解中书写切入点表达式. 但同一个切点表达式可能会在多个通知中重复出现.

  • 在 AspectJ 切面中, 可以通过 @Pointcut 注解将一个切入点声明成简单的方法. 切入点的方法体通常是空的, 因为将切入点定义与应用程序逻辑混在一起是不合理的.

  • 切入点方法的访问控制符同时也控制着这个切入点的可见性.

      • 如果切入点要在多个切面*用, 最好将它们集中在一个公共的类中.
      • 在这种情况下, 它们必须被声明为 public.
      • 在引入这个切入点时, 必须将类名也包括在内.
      • 如果类没有与这个切面放在同一个包中, 还必须包含包名.
  • 其他通知可以通过方法名称引入该切入点.

    @Pointcut("execution(int com.web.aop.impl.ArithmeticCalculatorImpl.*(int , int ))")
public void declareJoinPointExpression() {

}

【3】AspectJ 切入点表达式

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

(1).execution * com.atguigu.spring.ArithmeticCalculator.*(..)

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

(2).execution public * ArithmeticCalculator.*(..)

匹配 ArithmeticCalculator 接口的所有公有方法.

(3).execution public double ArithmeticCalculator.*(..)

匹配 ArithmeticCalculator 中返回 double 类型数值的方法

(4).execution public double ArithmeticCalculator.*(double, ..)

匹配第一个参数为 double 类型,结果返回类型为double类型的方法, ‘..’ 匹配任意数量任意类型的参数

(5).execution public double ArithmeticCalculator.*(double, double)

匹配参数类型为 double, 返回double 类型的方法.