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"和"表达式2"的交集
- XML配置中, "表达式1"和"表达式2"之间只能使用and.不能使用&&
- 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"和"表达式2"的交集
- 注解配置中,"表达式1"和"表达式2"之间只能使用&&符号. 不能使用and
- 支持"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"和"表达式2"的并集, 也就是两个表达式匹配到的方法都会被增强
- XML配置中, "表达式1"和"表达式2"之间既可以使用or.也可以使用||
- 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"和"表达式2"的并集, 也就是两个表达式匹配到的方法都会被增强
- 注解配置中, "表达式1"和"表达式2"之间只能使用||, 不能使用or
- 支持"p1() || p2()"写法
2.3 ! 非
2.3.1 XML配置
语法:
<!--配置AOP-->
<aop:config>
<!--配置aop的切面-->
<aop:aspect ref="通知类">
<aop:通知类型 method="方法名" pointcut="!表达式">
</aop:before>
</aop:aspect>
</aop:config>
注意:
- 获取的是通知类中, 非表达式的方法
- 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(){}
}
注意:
- 获取的是通知类中, 非表达式的方法
- 注解配置中, 支持"!p1() "写法