【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 类型的方法.