spring aop切入点表达式理解
结合这个链接一起看
(12条消息) spring aop切入点表达式详解_祁东握力的博客-CSDN博客_spring 切入点表达式
或者直接看手册:
Spring Framework 中文文档 - 11. Spring 面向切面的编程 | Docs4dev
execution(* com.xyz.myapp.service.*.*(..))
execution:用于匹配符合的方法;
第一个*号代表返回值类型为任意返回值类型
com.xyz.myapp.service.*代表这个包下的任意类
.*(..)任意方法
execution(* com.xyz.myapp.service.*.*(*))
(*)代表必须要有参数的方法,(..)有无参数都行
execution(* com.xyz.myapp.service..*.*(..))
service..*.*(..)表示当前包以及其子包的所有方法
在 Spring AOP(面向切面编程)中,切入点表达式用于定义哪些方法将被增强(即被前置、后置或环绕通知所拦截)。切入点表达式基于 AspectJ 表达式语言。
以下是一些常用的切入点表达式示例:
1. **匹配特定包下的所有方法**:
```java
@Pointcut("within(com.example.myapp)") // 匹配 com.example.myapp 包及其所有子包下的所有方法
```
2. **匹配特定类的所有方法**:
```java
@Pointcut("within(com.example.myapp.service.MyService)")
```
3. **匹配特定注解的方法**:
```java
@Pointcut("@annotation(com.example.myapp.annotation.MyCustomAnnotation)")
```
4. **匹配带有特定注解的方法**:
```java
@Pointcut("@within(org.springframework.stereotype.Service)")
```
5. **匹配特定接口的所有实现的方法**:
```java
@Pointcut("implements(com.example.myapp.dao.MyDao)")
```
6. **匹配特定返回类型的所有方法**:
```java
@Pointcut("returning(java.util.List)")
```
7. **匹配特定参数的方法**:
```java
@Pointcut("args(java.util.Map)") // 匹配有一个参数且该参数是 java.util.Map 的方法
```
8. **组合表达式**:
```java
@Pointcut("within(com.example.myapp.service.*) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")
```
9. **匹配执行时间超过特定阈值的方法**:
```java
@Pointcut("execution(* com.example.myapp.*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")
@Around("performanceMonitor() && @annotation(requestMapping)")
public Object monitorPerformance(ProceedingJoinPoint pjp) throws Throwable {
// 性能监控逻辑
}
```
10. **匹配特定的方法名**:
```java
@Pointcut("execution(* com.example.myapp.*.find*(..))")
```
11. **匹配特定的方法和参数**:
```java
@Pointcut("execution(* com.example.myapp.*.*(String, int)))")
```
这些表达式可以组合使用,以精确地定义哪些方法将被通知所拦截。在定义切入点时,可以使用 `&&`(和)、`||`(或)和 `!`(非)等逻辑运算符来组合多个表达式。
在 Spring AOP 中,你通常会将切入点表达式定义在一个切面类中,使用 `@Pointcut` 注解标记,然后在通知(如 `@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`、`@Around`)中通过引用这些切入点来使用它们。