Spring AOP切点表达式语法

1 切点表达式作用

AOP切点表达式(Pointcut Expression)是一种用于指定切点的语言,它可以通过定义匹配规则,来选择需要被切入的目标对象。

2 切点表达式语法

语法细节

  • 第一位:execution( ) 固定开头

  • 第二位:方法访问修饰符

    public private 直接描述对应修饰符即可
  • 第三位:方法返回值
   int String void 直接描述返回值类型
 注意:

 特殊情况 不考虑 访问修饰符和返回值

 execution(\* \* ) 这是错误语法

 execution( \*) == 你只要考虑返回值 或者 不考虑访问修饰符 相当于全部不考虑了
  • 第四位:指定包的地址
  	  固定的包: com.xxx.xxx | service | dao
      单层的任意命名: com.xxx.*  = com.xxx.api  com.xxx.dao  * = 任意一层的任意命名
      任意层任意命名: com.. = com.xxx.api.erdaye com.a.a.a.a.a.a.a  ..任意层,任意命名 用在包上!
      注意: ..不能用作包开头   public int .. 错误语法  com..
      找到任何包下: *..
  • 第五位:指定类名称
     固定名称: UserService
     任意类名: *
     部分任意: com..service.impl.*Impl
     任意包任意类: *..*
  • 第六位:指定方法名称
     语法和类名一致
     任意访问修饰符,任意类的任意方法: * *..*.*
  • 第七位:方法参数
      具体值: (String,int) != (int,String) 没有参数 ()
      模糊值: 任意参数 有 或者 没有 (..)  ..任意参数的意识
      部分具体和模糊:
        第一个参数是字符串的方法 (String..)
        最后一个参数是字符串 (..String)
        字符串开头,int结尾 (String..int)
        包含int类型(..int..)

3 重用(提取)切点表达式

3.1 重用切点表达式优点

    // @Before注解:声明当前方法是前置通知方法
   // value属性:指定切入点表达式,由切入点表达式控制当前通知方法要作用在哪一个目标方法上
   @Before(value = "execution(public int com.XXX.proxy.CalculatorPureImpl.add(int,int))")
   public void printLogBeforeCore() {
       System.out.println("[AOP前置通知] 方法开始了");
   }
   
   @AfterReturning(value = "execution(public int com.XXX.proxy.CalculatorPureImpl.add(int,int))")
   public void printLogAfterSuccess() {
       System.out.println("[AOP返回通知] 方法成功返回了");
   }
   
   @AfterThrowing(value = "execution(public int com.XXX.proxy.CalculatorPureImpl.add(int,int))")
   public void printLogAfterException() {
       System.out.println("[AOP异常通知] 方法抛异常了");
   }
   
   @After(value = "execution(public int com.XXX.proxy.CalculatorPureImpl.add(int,int))")
   public void printLogFinallyEnd() {
       System.out.println("[AOP后置通知] 方法最终结束了");
   }

上面案例,是我们之前编写切点表达式的方式,发现, 所有增强方法的切点表达式相同!

出现了冗余,如果需要切换也不方便统一维护!

我们可以将切点提取,在增强上进行引用即可!

3.2 同一类内部引用

提取

   // 切入点表达式重用
   @Pointcut("execution(public int com.XXX.aop.api.Calculator.add(int,int)))")
   public void declarPointCut() {}

注意:提取切点注解使用@Pointcut(切点表达式) , 需要添加到一个无参数无返回值方法上即可!

引用

   @Before(value = "declarPointCut()")
   public void printLogBeforeCoreOperation(JoinPoint joinPoint) {

3.3 不同类中引用

不同类在引用切点,只需要添加类的全限定符+方法名即可!

   @Before(value = "com.XXX.spring.aop.aspect.LogAspect.declarPointCut()")
   public Object roundAdvice(ProceedingJoinPoint joinPoint) {

3.4 切点统一管理

建议:将切点表达式统一存储到一个类中进行集中管理和维护!

   @Component
   public class AtguiguPointCut {
       
       @Pointcut(value = "execution(public int *..Calculator.sub(int,int))")
       public void atguiguGlobalPointCut(){}
       
       @Pointcut(value = "execution(public int *..Calculator.add(int,int))")
       public void atguiguSecondPointCut(){}
       
       @Pointcut(value = "execution(* *..*Service.*(..))")
       public void transactionPointCut(){}
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值