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
开头的方法(例如getUser
、getData
)。
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
直接匹配类或包)。
使用技巧
-
通配符
-
*
:匹配任意字符(除包分隔符.
)。 -
..
:匹配当前包及其子包,或任意数量的参数。
-
-
调试切入点表达式
-
使用宽松的表达式(如
execution(* com.weiyu..*.*(..))
)逐步缩小范围。 -
在切面方法中打印日志,确认是否触发。
-
-
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; }