Spring Aop 切点表达式
Spring Aop 切点表达式是 Spring Aop 框架中的一个重要的概念,它用于定义一个匹配切入点的规则,可以让开发者在 Aop 拦截时精准的选择目标方法或者目标类。
Spring Aop 切点表达式并不是一种编程语言,而是一系列规则组成的表达式,用来描述需要被拦截的方法或者类。
Spring Aop 支持多种表达式用于定义切点,以下是常见的表达式:
1. execution
这是一种最常用的切点表达式,用于匹配方法的执行,其语法形式如下:
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
其中,? 表示可选。各个元素解释如下:
- modifiers-pattern 表示方法的修饰符,比如 public、private 等。
- return-type-pattern 表示方法的返回类型,可以使用通配符。
- declaring-type-pattern 表示方法所属的类或者接口,可以使用通配符。
- method-name-pattern 表示方法的名称,可以使用通配符。
- param-pattern 表示方法的参数列表,可以使用通配符。
- throws-pattern 表示方法可能抛出的异常,可以使用通配符。
例如,下面的表达式表示匹配 MyService 类的所有 public 方法:
execution(public * com.example.MyService.*(..))
2. within
这种切点表达式用于匹配特定的类或者包,其语法形式如下:
within(type-pattern)
其中,type-pattern 表示需要匹配的类或者包。例如,下面的表达式表示匹配 com.example 包及其子包中的所有类:
within(com.example..*)
3. this/target
这两种切点表达式用于匹配某个特定类型的 bean 或者它的子类,其语法形式如下:
this(type-pattern)
target(type-pattern)
其中,type-pattern 表示需要匹配的 bean 类型。例如,下面的表达式表示匹配所有实现了 MyInterface 接口的 bean:
this(com.example.MyInterface)
target(com.example.MyInterface)
4. args
这种切点表达式用于匹配某个特定参数类型的方法,其语法形式如下:
args(type-pattern)
其中,type-pattern 表示需要匹配的参数类型。例如,下面的表达式表示匹配所有参数列表中包含 String 类型的方法:
execution(* *(String, ..))
5. @annotation
这种切点表达式用于匹配某个特定注解的方法,其语法形式如下:
@annotation(type-pattern)
其中,type-pattern 表示需要匹配的注解类型。例如,下面的表达式表示匹配所有标记了 @MyAnnotation 注解的方法:
@annotation(com.example.MyAnnotation)
6. bean
这种切点表达式用于匹配某个特定名称的 bean,其语法形式如下:
bean(name-pattern)
其中,name-pattern 表示需要匹配的 bean 名称。例如,下面的表达式表示匹配名为 userService 的 bean:
bean(userService)
总结:
Spring Aop 切点表达式是一种用于定义 Aop 切入点的规则,通过这些规则可以精确的选择目标方法或目标类进行拦截。Spring Aop 支持多种切点表达式,包括 execution、within、this/target、args、@annotation 和 bean 等。在实际开发中,应根据具体场景选择适当的切点表达式。
