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`)中通过引用这些切入点来使用它们。
 

posted @ 2021-08-24 20:44  在线电影制作人  阅读(7)  评论(0)    收藏  举报  来源