当前位置: 首页 > news >正文

AOP切入点表达式

切入点表达式(Pointcut Expression) 示例,帮助你灵活配置 AOP 的拦截规则:


1. 拦截特定类的所有方法

java

@Around("execution(* com.weiyu.service.impl.ReportServiceImpl.*(..))")
  • 说明:拦截 ReportServiceImpl 类中的所有方法(任意返回类型、任意参数)。


2. 拦截特定包下的所有类的所有方法

java

@Around("execution(* com.weiyu.service.impl.*.*(..))")
  • 说明:拦截 impl 包下所有类的所有方法。


3. 拦截特定方法名(模糊匹配)

java

@Around("execution(* com.weiyu.service..*.get*(..))")
  • 说明:拦截 service 包及其子包下,所有以 get 开头的方法(例如 getUsergetData)。


4. 拦截特定返回类型的方法

java

@Around("execution(com.weiyu.dto.ResponseResult com.weiyu.service..*.*(..))")
  • 说明:拦截返回类型为 ResponseResult 的方法。


5. 拦截带有特定注解的方法

java

@Around("@annotation(com.weiyu.annotation.LogExecutionTime)")
  • 说明:拦截所有被 @LogExecutionTime 注解标记的方法。


6. 拦截接口的所有实现类方法

java

@Around("execution(* com.weiyu.service.ReportService.*(..))")
  • 说明:拦截 ReportService 接口的所有实现类中的方法。


7. 拦截特定参数类型的方法

java

@Around("execution(* com.weiyu.service..*.save(*, com.weiyu.entity.User))")
  • 说明:拦截 save 方法,且第二个参数为 User 类型。


8. 拦截公共方法

java

@Around("execution(public * com.weiyu.service..*.*(..))")
  • 说明:仅拦截 public 修饰的方法(Spring AOP 默认只能拦截公共方法)。


9. 组合多个条件

java

@Around("execution(* com.weiyu.service..*.update*(..)) && args(id, ..)")
  • 说明:拦截 update 开头的方法,且第一个参数为 id


10. 使用 within 匹配类或包

java

@Around("within(com.weiyu.service.impl.*)")
  • 说明:拦截 impl 包下所有类的所有方法(与 execution 不同,within 直接匹配类或包)。


使用技巧

  1. 通配符

    • *:匹配任意字符(除包分隔符 .)。

    • ..:匹配当前包及其子包,或任意数量的参数。

  2. 调试切入点表达式

    • 使用宽松的表达式(如 execution(* com.weiyu..*.*(..)))逐步缩小范围。

    • 在切面方法中打印日志,确认是否触发。

  3. Spring AOP 限制

    • 默认只能拦截 public 方法。

    • 无法拦截同类内部方法调用(需通过代理对象调用)。


完整示例

java

// 拦截 service 包下所有类的所有公共方法
@Around("execution(public * com.weiyu.service..*.*(..))")
public Object logAllPublicMethods(ProceedingJoinPoint joinPoint) throws Throwable {
    // 记录方法执行时间
    long start = System.currentTimeMillis();
    Object result = joinPoint.proceed();
    long duration = System.currentTimeMillis() - start;
    
    log.info("方法 {} 执行耗时: {}ms", joinPoint.getSignature(), duration);
    return result;
}

相关文章:

  • acwing1233.全球变暖
  • 【sgAutocomplete_v2】自定义组件:基于elementUI的el-input组件开发的搜索输入框(支持本地保存历史搜索关键词、后台获取匹配项)
  • linux-----------------指令下集
  • python中mysql操作整理
  • 基于TCN-BiLSTM-Attention的序列数据预测(功率预测、故障诊断)模型及代码详解
  • Spring Boot 整合 Elasticsearch 实践:从入门到上手
  • Leetcode——28. 找出字符串中第一个匹配项的下标
  • 使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化
  • 在大数据开发中ETL是指什么?
  • 网络编程-实现客户端通信
  • conda相关总结
  • 基于Spring Boot的图书管理系统的设计与实现(LW+源码+讲解)
  • 蓝桥杯真题——洛谷Day13 找规律(修建灌木)、字符串(乘法表)、队列(球票)
  • 如何制作一个自己的网站?
  • Excel 小黑第12套
  • 【华为OD-E卷 - 求符合条件元组个数 100分(python、java、c++、js、c)】
  • Redis高级结构-布隆过滤器
  • 【量化科普】Alpha,阿尔法收益
  • laravel 对 数据库 json 字段的查询方式汇总
  • 在 Offset Explorer 中配置多节点 Kafka 集群的详细指南
  • 当创业热土遇上年轻气息,上海南汇新城发展如何再发力?
  • 卢正已任上海市司法局党委委员、副局长
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”
  • 华泰柏瑞基金总经理韩勇因工作调整卸任,董事长贾波代为履职
  • 读图|展现城市品格,上海城市影像走进南美
  • 上交现场配乐4K修复版《神女》:默片巅峰有了新的打开方式