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;
}
