6.切点表达式
Spring AOP(面向切面编程)使用切入点表达式来定义哪些连接点(join points)应该应用切面逻辑。
切入点表达式是一种灵活的方式来指定哪些方法调用、构造函数调用或其他类型的连接点应该触发通知(advice)的执行。
Spring AOP 支持多种类型的切入点表达式,最常用的是基于方法调用的表达式。
6.1.基本语法
Spring AOP 的切入点表达式通常使用 execution
函数来定义方法调用的切入点。基本形式如下:
execution(modifiers-pattern? ret-type-pattern declaring-class-pattern? name-pattern(param-pattern) throws-pattern?)
这里的各个部分解释如下:
- modifiers-pattern?: 可选的修饰符模式,如
public
、protected
、private
或*
(任意)。 - ret-type-pattern: 返回类型模式,如
int
、java.lang.String
或*
(任意)。 - declaring-class-pattern?: 可选的声明类模式,如
com.example.*
(包下的任何类)或*
(任意)。 - name-pattern: 方法名模式,如
doSomething
或*
(任意)。 - param-pattern: 参数列表模式,如
(int, java.lang.String)
或*(..)
(任意数量和类型的参数)。 - throws-pattern?: 可选的异常模式,如
throws java.lang.Exception
或*
(任意)。
6.2.示例
假设你有一个 BusinessService
类,其中包含 doSomething()
方法,下面是几个切入点表达式的例子:
- 匹配所有公共方法:
execution(public * com.example.BusinessService.*(..))
- 匹配
BusinessService
类中的所有doSomething()
方法:
execution(* com.example.BusinessService.doSomething(..))
- 匹配所有
doSomething()
方法,无论在哪个类中:
execution(* *.doSomething(..))
- 匹配所有返回类型为
void
的方法:
execution(void *.*(..))
- 匹配所有带有两个参数的方法:
execution(* *.*(?, ?))
- 匹配所有带有两个字符串参数的方法:
execution(* *.*(java.lang.String, java.lang.String))
- 匹配所有带有
Exception
异常的方法:
execution(* *.*(..) throws java.lang.Exception)
6.3.其他类型的切入点
除了 execution
函数之外,Spring AOP 还支持以下类型的切入点表达式:
-
within
: 匹配特定类的所有方法。within(com.example.BusinessService+)
-
this
: 匹配代理对象的类型。this(com.example.BusinessService)
-
target
: 匹配目标对象的类型。target(com.