切入点表达式的扩展写法

1. 概述

在切入点表达式中, Spring允许使用&&, || , ! 等符号, 以便于定义一些复杂的切入点表达式.

&& / and : 取两个表达式的交集

|| / or : 取两个表达式的并集(也就是两个表达式都会满足)

! : 排除当前表达式,取相反结果

2. 详解

2.1 && / and

2.1.1 XML配置

语法:

<!--配置AOP-->
<aop:config>
    <!--配置aop的切面-->
    <aop:aspect ref="通知类">
        <aop:通知类型 method="方法名" pointcut="表达式1 and 表达式2">
        </aop:before>
    </aop:aspect>
</aop:config>

注意:

  1. 获取的是"表达式1"和"表达式2"的交集
  2. XML配置中, "表达式1"和"表达式2"之间只能使用and.不能使用&&
  3. pointcut-ref不支持该种写法
2.1.2 注解配置

语法:

 @Aspect
    public class MyAdvice {
        
        @AfterReturning("表达式1 && 表达式2")
        public void logs() {
            System.out.println("----记录日志----");
        }
            
        @Pointcut("表达式1")
        public void p1(){}
    
        @Pointcut("表达式2")
        public void p2(){}
    }

注意:

  1. 获取的是"表达式1"和"表达式2"的交集
  2. 注解配置中,"表达式1"和"表达式2"之间只能使用&&符号. 不能使用and
  3. 支持"p1() && p2()"写法

2.2 || / or

2.2.1 XML配置

语法:

<!--配置AOP-->
<aop:config>
    <!--配置aop的切面-->
    <aop:aspect ref="通知类">
        <aop:通知类型 method="方法名" pointcut="表达式1 or 表达式2">
        </aop:before>
    </aop:aspect>
</aop:config>

注意:

  1. 获取的是"表达式1"和"表达式2"的并集, 也就是两个表达式匹配到的方法都会被增强
  2. XML配置中, "表达式1"和"表达式2"之间既可以使用or.也可以使用||
  3. pointcut-ref不支持该种写法

2.2.2 注解配置

语法:

@Aspect
public class MyAdvice {
    
    @AfterReturning("表达式1 || 表达式2")
    public void logs() {
        System.out.println("----记录日志----");
    }
        
    @Pointcut("表达式1")
    public void p1(){}

    @Pointcut("表达式2")
    public void p2(){}
}

注意:

  1. 获取的是"表达式1"和"表达式2"的并集, 也就是两个表达式匹配到的方法都会被增强
  2. 注解配置中, "表达式1"和"表达式2"之间只能使用||, 不能使用or
  3. 支持"p1() || p2()"写法

2.3 ! 非

2.3.1 XML配置

语法:

 <!--配置AOP-->
    <aop:config>
        <!--配置aop的切面-->
        <aop:aspect ref="通知类">
            <aop:通知类型 method="方法名" pointcut="!表达式">
            </aop:before>
        </aop:aspect>
    </aop:config>

注意:

  1. 获取的是通知类中, 非表达式的方法
  2. pointcut-ref不支持该种写法

2.3.2 注解配置

语法:

 @Aspect
    public class MyAdvice {
        
        @AfterReturning("!p1()")
        public void logs() {
            System.out.println("----记录日志----");
        }
            
        @Pointcut("表达式1")
        public void p1(){}
    
        @Pointcut("表达式2")
        public void p2(){}
    }

注意:

  1. 获取的是通知类中, 非表达式的方法
  2. 注解配置中, 支持"!p1() "写法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大梦谁先觉i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值