Spring学习笔记_24——切入点表达式
切入点表达式
1. 介绍
在Spring框架中,切入点(Pointcut)表达式用于指定哪些方法应该被拦截。这通常是在创建AOP(面向切面编程)时使用,用于定义切面(Aspect)中的哪些连接点(Join point)是感兴趣的。
切入点表达式(Pointcut Expression)是AOP(面向切面编程)的一个核心概念,它用于定义哪些方法将被增强(即添加额外的行为)。
2. 分类
方法执行:execution(MethodSignature)
方法调用:call(MethodSignature)
构造器执行:execution(ConstructorSignature)
构造器调用:call(ConstructorSignature)
类初始化:staticinitialization(TypeSignature)
属性读操作:get(FieldSignature)
属性写操作:set(FieldSignature)
例外处理执行:handler(TypeSignature)
对象初始化:initialization(ConstructorSignature)
对象预先初始化:preinitialization(ConstructorSignature)
3. 切入点表达式
- excution:这是最常用的切入点表达式,用于匹配方法的执行。
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? (parameter-pattern)* throws-pattern?)
。
modifiers-pattern
:匹配方法的访问修饰符,如public
、private
等。
ret-type-pattern
:匹配返回值类型。
declaring-type-pattern
:匹配声明方法的类。
parameter-pattern
:匹配方法参数。
throws-pattern
:匹配方法可能抛出的异常类型。
- within:匹配在指定类或包中的连接点
- 例如:
within(com.example..*)
匹配com.example
包及其子包中的所有类的方法。
- this: 匹配目标对象是指定类型的连接点
- 例如:
this(com.example.MyClass)
匹配目标对象是MyClass
类型的方法。
- target:匹配调用连接点目标对象是指定类型的连接点
- 例如:
target(com.example.MyClass)
匹配调用对象是MyClass
类型的方法
- args:匹配方法参数是指定类型的连接点
- 例如:
args(java.lang.String)
匹配方法参数列表中包含String
类型参数的方法
- @within:用于匹配带有指定注解的类(指的是这个类上面有指定的注解)
- 例如:
@within(com.example.annotation.MyAnnotation)
:匹配所有带有MyAnnotation
注解的类中的方法。
- @args:用于匹配参数中带有指定注解的方法
- 例如:
@args(com.example.annotation.MyAnnotation)
,匹配方法参数类型上拥有MyAnnotation
注解的方法调用。
- @target:匹配目标对象有指定注解的连接点
- 例如:
@target(org.springframework.stereotype.Service)
匹配目标对象上有@Service
注解的方法。
- @annotation:匹配方法或方法参数上有指定注解的连接点
- 例如:
@annotation(org.springframework.web.bind.annotation.RequestMapping)
匹配方法上有@RequestMapping
注解的方法
- bean:Spring独有的方法,用于匹配指定的bean的方法。
- 例如:
bean(userService)
:匹配名为userService
的bean的所有方法
3. 通配符
*
:匹配任何数量的字符。
..
:匹配任何数量的类或接口,包括子包。
- +:表示指定类和子类(主要用于
within
表达式)。
4. 组合表达式
切入点表达式可以通过逻辑运算符(如&&
、||
、!
)进行组合,以实现更复杂的匹配规则。
- 例如:
execution(* com.example.service.*.*(..)) && args(String)
:匹配com.example.service
包及其子包下所有带有一个String
参数的方法。